2010-04-17 25 views
8

Disclaimer: người tuyệt đối trong Scala :(Scala: Không thể bắt ngoại lệ ném ra bên trong một đóng

Tôi đã sau đây định nghĩa:

def tryAndReport(body: Unit) : Unit = { 
    try { 
    body 
    } catch { 
    case e: MySpecificException => doSomethingUseful 
    } 
} 

Tôi gọi nó là như thế này:

tryAndReport{ 
    someCodeThatThrowsMySpecificException() 
} 

Khi cuộc gọi tới someCodeThatThrowsMySpecificException xảy ra tốt, ngoại lệ không bị bắt trong tryAndReport.

Tại sao?

Cảm ơn bạn!

Trả lời

12

Thử thay đổi nội dung từ Unit thành => Unit. Cách thức được xác định ngay bây giờ, nó xem xét body một khối mã để đánh giá là Unit. Sử dụng gọi theo tên, nó sẽ được thực hiện trong các try như được xác định và nên bị bắt.

6

body trong phương pháp tryAndReport của bạn không phải là đóng hoặc chặn, đó là một giá trị (loại Unit).

Tôi không khuyên bạn nên sử dụng đối số tên, mà là một hàm rõ ràng.

def tryAndReport(block:() => Unit): Unit = { 
    try { block() } 
    catch { case e: MSE => dSU } 
} 
+0

* Tôi không khuyên bạn nên sử dụng đối số tên, mà là một hàm rõ ràng. * - Tại sao? – missingfaktor

+0

Tôi thứ hai, bạn không nên đưa ra một khuyến nghị như thế mà không có lý do. –

+0

Bởi vì tôi tin vào những gì bạn muốn nói. Bạn muốn hàm được đánh giá trong phần nội dung của 'tryAndReport', không được ẩn đằng sau tham số tên. –

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