2016-06-27 2 views
4

StackOverflowError를 (아마도) 생성 할 수있는 함수가 있습니다. 물론 이것이 나쁜 디자인의 징표이지만, 지금은 Try로 포장하기로 결정했습니다.스칼라가 java.lang.StackOverflowError를 잡아 내지 않는 이유는 무엇입니까?

Try{ 
    Calculator.eval(..) 
} 

내가 기대하는 결과는 실패 (java.lang.StackOverflowError의)입니다. 결과는 단지 java.lang.StackOverflowError입니다. 문제는 StackOverflowError가 Exception이 아니라 오류라고 가정합니다. 그런 경우 Try 또는 다른 모나드를 사용하여 이러한 종류의 오류를 "catch"할 수있는 방법이 있습니까?

답변

8

스칼라 문서에 따르면

참고 : 치명적이지 않은 예외의 콤비에 의해 잡힌는 (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

감사합니다! 그것은 정말로 효과적이다. –

관련 문제