2012-04-19 2 views
3

나는 기능이 있습니다.중첩 된 tryCatch가 오류를 catch하지 않습니까?

buggy <- function(...) { 
    tryCatch({ 
     itWorked <- FALSE 
     stop("I don't like green eggs and ham!") 
     itWorked <- TRUE 
    }, finally = { 
     if (itWorked) 
      return("I do, Sam I am") 
     else 
      return("I do not like them, Sam I am!") 
    }) 
} 

기본적으로 buggy가 나 (itWorked에 의해 결정 성공하지 못할 수있는 몇 가지 계산을하려고를 finally 절은 단지 계산이 뭔가를 작동하지 않은 경우에도 있는지 확인합니다 . (이 경우, "I do not like them, Sam I am!"에서) 반환됩니다

를이 예상대로 작동합니다

> buggy() 
Error in tryCatchList(expr, classes, parentenv, handlers) : 
    I don't like green eggs and ham! 
[1] "I do not like them, Sam I am!" 

이 지금은오류를 수신 할:

buggy에 오류가 주변 tryCatch에 오류를 발생하지 그러나
tryCatch(buggy(), 
      error=function(e) message('too bad! there was an error')) 

'too bad! there was an error' 
[1] "I do not like them, Sam I am!" 

사람이 말해 줄 수 :

> tryCatch(buggy(), 
+   error=function(e) message('too bad! there was an error')) 
[1] "I do not like them, Sam I am!" 

나는이 말을 기대 이 작동하지 않습니다? buggy에서 오류를 어떻게 든 '제기'해야합니까?

답변

2

외부 tryCatch()는 다음 호출하지 않는 것을 당신에게 정확히 같은 이유로 그 error 인수에 저장된 메시지를 제공하지 않습니다

tryCatch("I do not like them, Sam I am!", 
    error=function(e) message('too bad! there was an error')) 
# [1] "I do not like them, Sam I am!" 

두 줄까지 error 인수의 메시지

buggy()이 오류를 반환 한 경우에만 호출됩니다. 그러나 대신 (그것의 tryCatch() 내부의 작업 덕분에), buggy() 그냥 문자 벡터를 반환하고 tryCatch() 아무것도에 '캐치'가 없습니다 :

value <- buggy() 
value 
# [1] "I do not like them, Sam I am!" 

# And, to belabor the point: 
identical(buggy(), "I do not like them, Sam I am!") 
# [1] TRUE 
+0

오, 내가 볼 수 있습니다. 그렇다면'buggy'가 에러시 값을 반환하는 표준적인 절차는 무엇입니까 (제 계산의 중간 단계, 여전히 사용할 수는 있지만 재 계산하지 않으려합니다). 오류가 발생했습니다 (따라서 최종 결과 대신 중간 결과가 반환됩니다). –

+0

방금 ​​말한 것을 잊어 버렸습니다. 제 * 특정 경우에 다음이 내 'finally'(매개 변수'return.intermediate.on.error')에 대해 수행한다는 것을 깨달았습니다 : if (itWorked || return. intermediate.on.error) {return (...)} else {stop (reason_for_failure)}', 그리고 계산 내에서'reason_for_failure'를 저장해야 할 것입니다. 그것은 "R 방식"으로 보이지 않습니다. 다음과 같이 말하면 좋을 것입니다 :'error = function (e) {raise_error(); 반환 (...)}'. –

+0

경고를 생성하기 위해'warning()'을 사용하면 오류를 일으키는'stop()'대신에) 당신의 목적에 맞는 것이겠습니까? 뭔가 잘못되었다는 메시지로 통보 받기를 원하는 것처럼 들리므로 가장 간단한 해결책 일 수 있습니다. –

관련 문제