为什么Scala尝试不捕获java.lang.StackOverflowError?

时间:2016-06-27 11:50:17

标签: java scala

我有一些可能(可能)产生StackOverflowError的函数。当然这是一个糟糕设计的标志,但是现在我决定将它包装到Try中。

Try{
  Calculator.eval(..)
}

我期望的结果是失败(java.lang.StackOverflowError)。 我得到的结果只是java.lang.StackOverflowError。我想问题是StackOverflowError不是Exception,而是一个错误。如果是,有没有办法通过使用Try或其他monad来“捕获”这类错误?

1 个答案:

答案 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(..)
}