我有一些可能(可能)产生StackOverflowError的函数。当然这是一个糟糕设计的标志,但是现在我决定将它包装到Try中。
Try{
Calculator.eval(..)
}
我期望的结果是失败(java.lang.StackOverflowError)。 我得到的结果只是java.lang.StackOverflowError。我想问题是StackOverflowError不是Exception,而是一个错误。如果是,有没有办法通过使用Try或其他monad来“捕获”这类错误?
答案 0 :(得分:10)
根据Scala文档。
注意:Try上的组合器仅捕获非致命异常 (见scala.util.control.NonFatal)。严重的系统错误,另一方面 手,将被抛出。
Throwable -> Errors
无法抓取Try
。
我会实现一些允许为你的案例处理Errors
的包装器:
object TryAll {
def apply[K](f: => K): Try[K] =
try {
Success(f)
} catch {
case e: Throwable => Failure(e)
}
}
TryAll {
Calculator.eval(..)
}