문제

내 동료와 나의 R 스크립트에 대한 일관된 예외 처리 인터페이스를 설정하려면 다음 trycatch 구조를 사용하고 싶습니다.

  1. 외부 trycatch는 주어진 r 스크립트 주위에 포장됩니다. 스크립트가 중단 해야하는 치명적인 오류를 잡아서 처리하는 데 사용됩니다.
  2. 사용자의 스크립트 내의 사용자 별 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)
})
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top