2010-10-18 44 views

Trả lời

30
scala.util.control.Exception.ignoring(classOf[ExceptionType]) { 
    ... // Some throwing code 
} 
4

Trong mọi trường hợp ngoại lệ không được kiểm tra, vì vậy nếu bạn không muốn, bạn có thể bỏ qua xử lý chúng (và do đó ngoại lệ sẽ được chuyển lên cấp cao hơn). Lặng lẽ bỏ qua một ngoại lệ theo cách bạn muốn làm thường là một thực hành tồi. Tuy nhiên, mã của bạn có thể được rút ngắn xuống còn:

try { 
    ... // Some throwing code 
} catch { 
    case e:ExceptionType => 
} 
15

@Daniel đã cung cấp phương pháp kinh điển để sử dụng để làm điều này. Xem qua các phương pháp khác trong scala.util.control.Exception - chúng khá hữu ích và chung chung!

Nếu bạn cần lấy giá trị trả về từ khối thử, hãy sử dụng failing thay vì ignoring (nhưng lưu ý rằng kết quả là Any, tức là không an toàn).

Bạn cũng có thể viết riêng ngoại lệ-catcher của bạn, mà sẽ là một chút chậm cho công việc nặng nhưng nếu không tốt đẹp để sử dụng:

class DefaultOn[E <: Exception] { 
    def apply[A](default: => A)(f: => A)(implicit m: Manifest[E]) = { 
    try { f } catch { case x if (m.erasure.isInstance(x)) => default } 
    } 
} 
object DefaultOn { def apply[E <: Exception] = new DefaultOn[E] } 

scala> DefaultOn[NumberFormatException](0) { "Hi".toInt } 
res0: Int = 0 

Hoặc nếu bạn thích lựa chọn:

class TryOption[E <: Exception] { 
    def apply[A](f: => A)(implicit m: Manifest[E]) = { 
    try { Some(f) } catch { case x if (m.erasure.isInstance(x)) => None } 
    } 
} 
object TryOption { def apply[E <: Exception] = new TryOption[E] } 

scala> TryOption[NumberFormatException] { "Hi".toInt } 
res1: Option[Int] = None 

Hoặc bạn có thể lấy cảm hứng từ điều này cộng với thói quen thư viện và tạo ra các phương thức của riêng bạn để bỏ qua nhiều ngoại lệ khác nhau và bảo toàn các kiểu trên giá trị trả lại.

+0

Tôi giả sử DefaultTo nên được thay thế bằng DefaultOn trong khối mã đầu tiên. – Qrilka

+0

@Qrilka - Vâng, cảm ơn! Sửa lỗi. –

+0

BTW nó có thể được viết ngắn hơn một chút với 'xử lý (classOf [NumberFormatException]) bởi (_ => 0) {" Hi ".toInt}' – Qrilka

0

bí quyết về:

Try { 
    // some throwing code 
} 

này sẽ bỏ qua tất cả các trường hợp ngoại lệ gây tử vong thuốc, đó là những gì bạn muốn làm hầu hết thời gian.

+0

Bạn có ý nghĩa gì bởi ngoại lệ không gây tử vong? – Basilevs

+0

Có một cái nhìn tại nguồn cho thử, nó gọi NonFatal, trong đó xem xét VirtualMachineError, ThreadDeath, InterruptedException, LinkageError và ControlThrowable được gây tử vong – jonathanChap

+0

Điều này là không chính xác. Theo Scala 2.11, điều này sẽ đưa ra một cảnh báo tại thời gian biên dịch: "Một thử mà không có một nắm bắt hoặc cuối cùng là tương đương với việc đặt cơ thể của nó trong một khối, không có trường hợp ngoại lệ được xử lý." Thật vậy, nó là giống hệt nhau không sử dụng thử ở tất cả. Bạn phải thêm bắt để bắt ngoại lệ NonFatal, nghĩa là bắt {case NonFatal (e) =>} – TaylerJones

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