@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.
Nguồn
2010-10-18 16:25:02
Tôi giả sử DefaultTo nên được thay thế bằng DefaultOn trong khối mã đầu tiên. – Qrilka
@Qrilka - Vâng, cảm ơn! Sửa lỗi. –
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