2015-07-02 18 views
7

Trong Scala, sự khác nhau giữa việc trả lại Future.failed(new Exception("message!"))throw new Exception("message!") là gì?Sự khác biệt giữa việc trả lại Future.failed (Ngoại lệ) và ném một ngoại lệ

Hãy nói điều này đang xảy ra trong một chức năng mà là để trở Future[Unit], và chức năng gọi điện thoại là như vậy:

someFunction onFailure { 
    case ex: Exception => log("Some exception was thrown") 
} 

Có một sở thích của một trong khác hoặc một trường hợp sử dụng cụ thể cho từng?

Trả lời

8

Gọi Future { throw ex }Future.failed(ex) sẽ tạo kết quả tương đương. Tuy nhiên, việc sử dụng Future.failed sẽ hiệu quả hơn. Nếu chúng ta nhìn vào đoạn mã này từ Future.apply (từ here in the source):

promise complete { 
    try Success(body) catch { case NonFatal(e) => Failure(e) } 
} 

Chúng tôi nhận thấy rằng (như có thể được dự kiến), điều này phụ thuộc vào một khối try...catch. Chúng được biết là mang nặng trên không khi so sánh với mã thông thường. Phương pháp Future.failed về cơ bản là một phím tắt cho điều này mà không phải chịu chi phí thực sự bao giờ ném ngoại lệ.

+4

Trên thực tế, phần lớn chi phí trong xử lý ngoại lệ xuất phát từ sự khởi tạo của các ngoại lệ (vì chúng - theo mặc định - nắm bắt được ngăn xếp, khá đắt). Bởi vì bạn sẽ tạo ra một ngoại lệ cho dù bạn sử dụng 'Future.failed' hoặc' Future {throw ex} '), phần đó không nhập vào phương trình. Mà chỉ để lại cơ chế ném/nắm bắt thực tế để xem xét. Nó chắc chắn có một chi phí, nhưng nó bị chi phối bởi chi phí tạo ra ngoại lệ ở nơi đầu tiên, vì vậy việc sử dụng một trong hai phong cách sẽ không thành vấn đề nhiều trong thực tế. –

+0

Để cung cấp cho bạn ý tưởng, tôi đã thực hiện một điểm chuẩn (hoàn toàn không khoa học) để so sánh thời gian thực hiện của trường hợp "ngoại lệ mới + ném + bắt" đối với trường hợp "ngoại lệ mới" và sự khác biệt nhỏ hơn 1% trên máy của tôi . –

+1

Đủ công bằng. Tôi tự hỏi, nếu các yếu tố khác như sử dụng bộ nhớ cũng có sự khác biệt. Bất kể, tôi sẽ nói rằng phương pháp 'thất bại' là sạch hơn và thành ngữ hơn. –

Các vấn đề liên quan