R.에서 벗어나지 않는 예외 처리 및 스택
-
12-12-2019 - |
문제
내 동료와 나의 R 스크립트에 대한 일관된 예외 처리 인터페이스를 설정하려면 다음 trycatch 구조를 사용하고 싶습니다.
- 외부 trycatch는 주어진 r 스크립트 주위에 포장됩니다. 스크립트가 중단 해야하는 치명적인 오류를 잡아서 처리하는 데 사용됩니다.
- 사용자의 스크립트 내의 사용자 별 TryCatch 명령. 이것들은 잡아야 할 것입니다
- 2a. 치명적인 오류가없는 오류가 없으며 스크립트 낙태가 필요하지 않습니다
- 2b. 스크립트가 중단 해야하는 치명적인 오류가 발생합니다. 오류는 외부 TryCatch [참조 1] 에 의해 처리됩니다.
- 2c. 추가 오류 정보가있는 치명적인 오류가 발생합니다. Outer Trycatch가 처리하는 중 오류가 발생했습니다.
다음 코드는 내가 이러한 기능을 구현하는 방법입니다. 그러나, 나는 r에서 전문가가 아니기 때문에 이것이 좋은 접근 방식인지 물어보고 싶습니다. 구체적으로 :
Q1. 내부 trycatch에서 오류 처리기를 지정하고 외부 trycatch가 해당 오류를 처리 할 때까지 기다리는 것이 좋습니다 (아래 및 아래 코드를 참조하십시오)?
Q2. 핸들러 올바른 / 고려되는 코딩 스타일로 간주되는 동일한 오류 (2C. 위 / 아래)와 동일한 오류 (2C. 위 / 아래)를 재배치하고 있습니까?
고맙습니다!
.#outer tryCatch, see 1. tryCatch({ #user code block #2a. user specific tryCatch, object "vec" not defined tryCatch(print(vec),error=function(e) {print("Non-fatal error. Script execution continued.");print(e);}) #2b. user specific tryCatch tryCatch(vec*2) #2c. user specific tryCatch tryCatch(vec*parameter1, error=function(e) {print("Additional fatal error information. Script execution aborted.");stop(e);}) #end of user code block }, #outer tryCatch error handler in order to handle fatal errors error=function(e) {print("Fatal error");print(e);} )
해결책
오류 만 잡을 수 있도록 완벽하게 괜찮아요, 외부 핸들러 또는 모든 핸들러가 전혀 없어지지 않습니다.오류 시스템은 일반적으로 사용되는 것보다 훨씬 조금 더 유연하므로 오류를 다시 던지기 위해 자신의 오류 유형 생성
ourError <-
function(original, message, class="ourError")
{
msg <- paste(message, conditionMessage(original), sep="\n ")
structure(list(message = msg, call = conditionCall(original)),
class = c(class, class(original)))
}
.
및 던지기 및 / 또는 취급
tryCatch(vec*parameter1, error=function(e) {
err <- ourError(e, "addition fatal info; script aborted")
stop(err)
})
.
ourError()
가 반환 한 클래스를 사용하여 최상위 핸들러에서 추가적인 동작을 최상위 핸들러에 지정할 수 있다는 것입니다.
tryCatch({
tryCatch(stop("oops"), error=function(e) {
err <- ourError(e, "addition fatal info; script aborted",
c("fatal", "ourError"))
stop(err)
})
}, ourError=function(err) {
message("We caught but didn't handle this:\n", err)
}, error =function(err) {
message("This one got away: ", err)
})
. 제휴하지 않습니다 StackOverflow