2013-12-22 2 views
5

스칼라 미래가 실패하고 해당 실패를 "관찰"하는 연속성이 없거나 map/flatMap을 사용하는 유일한 연속성이며 실패시 실행되지 않으면 오류가 감지되지 않습니다 . 이러한 오류가 최소한 기록되므로 버그를 찾을 수 있습니다.스칼라 미래에 처리되지 않은 오류 잡기

.Net 작업에서 GC로 작업 개체를 수집 할 때 "관찰되지 않은 작업 예외"를 잡을 기회가 있기 때문에 "관찰 된 오류"라는 용어를 사용합니다. 마찬가지로 동기식 메서드를 사용하면 스레드를 종료하는 catch되지 않는 예외를 기록 할 수 있습니다.

스칼라 미래에서 실패를 '관찰'하는 것은 일부 연속 코드 또는 다른 코드가 해당 미래가 처리되기 전에 미래 값에 저장된 예외를 읽는다는 것을 의미합니다. 나는 finalization이 결정론 적이거나 신뢰할 수 없다는 것을 알고 있으며 아마도 그것이 .Net이 이것을 성공적으로 수행하더라도 처리되지 않은 오류를 잡는 데 사용되지 않는 이유 일 것입니다.

스칼라에서이를 수행 할 수있는 방법이 있습니까? 그렇지 않은 경우 처리되지 않은 오류 버그를 방지하기 위해 코드를 어떻게 구성해야합니까?

오늘 나는 다양한 선물에 andThen checkResult을 추가했습니다. 그러나 이것을 언제 사용해야 하는지를 알기가 어렵습니다. 라이브러리 메소드가 Future를 반환하면 라이브러리 사용자가 실패를 처리 할 수 ​​있기 때문에 오류를 자체적으로 확인하고 로그하지 않아야하므로 책임이 사용자에게 위임됩니다. 코드를 편집 할 때 때로는 수표를 추가해야 할 때가 있습니다. 때로는 수표를 추가해야하는 경우도 있습니다. 이러한 수작업 관리는 분명히 잘못되었습니다.

+0

가능한 복제본 [Scala Future에 예외를 던지려면 어떻게합니까?] (http://stackoverflow.com/questions/6229778/how-do-i-get-hold-of-exceptions-thrown- in-a-scala-future) –

+4

그것은 중복이 아닙니다. 나는 미래로부터 예외를 얻는 방법을 안다. 내가 필요로하는 것은 프로그래머가 미래로부터 예외를 잊어 버린 버그를 처리하는 방법이다. 버그가 발생했을 때이를 막거나 catch/log 할 수있다. – danarmak

답변

3

나는 Scala 선물에서 처리되지 않은 오류를 일반적으로 알 수있는 방법이 없다고 결론을 내 렸습니다.

5

미래를 반환하는 함수에서 Future.recover 만 사용할 수 있습니다.

그래서 예를 들어, 당신은 단지 간단한 경우에 오류를 "로그"원래 예외를 다시 발생 수 :

def libraryFunction(): Future[Int] = { 
    val f = ... 
    f.recover { 
     case NonFatal(t) => 
     println("Error : " + t) 
     throw t 
    } 
} 

참고 NonFatal의 사용은 잡을 분별있는 모든 예외 유형에 맞게 .
원한다면 복구 블록이 똑같이 다른 결과를 반환 할 수 있습니다.

+0

프로그래머가 오류 조건을 확인하는 것을 잊어 버린 경우에도 결국 오류를 감지 할 수있는 방법이 필요했습니다. 그런 선택의 여지가없는 것처럼 보입니다. – danarmak

+0

아니요. 미래 예외의 "처리"는 일반적으로 onComplete 처리기를 추가하는 것과 같습니다. 따라서 예외 처리가 첨부되어 있는지 감지 할 수 있도록 결과 또는 예외가 분리되지 않습니다. –

관련 문제