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

ig-*_*nyk 6 java scala

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

Try{
  Calculator.eval(..)
}
Run Code Online (Sandbox Code Playgroud)

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

vvg*_*vvg 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(..)
}
Run Code Online (Sandbox Code Playgroud)