2016-06-27 3 views
4

私は(おそらく)StackOverflowErrorを生成できる関数をいくつか持っています。もちろん、これは悪いデザインの兆候ですが、今は試しにラップすることに決めました。Scalaがjava.lang.StackOverflowErrorをキャッチしないのはなぜですか?

Try{ 
    Calculator.eval(..) 
} 

私が期待した結果は、失敗(java.lang.StackOverflowErrorを)です。 私が得た結果はjava.lang.StackOverflowErrorです。 StackOverflowErrorはExceptionではなく、エラーであるという問題があると思います。そうであれば、Tryや他のモナドを使って、そのようなエラーを "キャッチ"する方法はありますか?

答えて

8

Scalaのドキュメントに従ってください。

注:唯一の非致命的な例外は上コンビネータによってキャッチされているが(scala.util.control.NonFatalを参照) を試してみてください。他の 手に重大なシステムエラーがスローされます。

いいえThrowable -> ErrorsTryで捕捉されます。

私はあなたのケースのためのErrorsを処理できるようにいくつかのラッパーを実装します:

object TryAll { 
    def apply[K](f: => K): Try[K] = 
    try { 
     Success(f) 
    } catch { 
     case e: Throwable => Failure(e) 
    } 
} 


TryAll { 
    Calculator.eval(..) 
} 
+0

感謝を!それは本当にうまくいく。 –

関連する問題