5

为了为我的同事和我的 R 脚本设置一个连贯的异常处理接口,我想采用以下 tryCatch 结构。

  1. 外部 tryCatch 包裹在给定的 R 脚本周围。它用于捕获和处理需要脚本中止的致命错误。
  2. 用户脚本中特定于用户的 tryCatch 命令。这些应该捕获并可能处理
    • 2a。非致命错误,不需要脚本中止
    • 2b。需要脚本中止的致命错误。错误由外部 tryCatch 处理 [参见 1.]
    • 2c。带有附加错误信息的致命错误。外部 tryCatch 处理的错误。

以下代码是我将如何实现这些功能。但是,由于我不是 R 方面的专家,我想问一下这是否是一个好方法。具体来说:

Q1。是否可以不在内部 tryCatch 中指定错误处理程序并等待外部 tryCatch 处理该错误(参见上面的 2b. 和下面的代码)?

Q2。在处理程序中重新抛出相同的错误(参见上面/下面的 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);} 
    )
4

1 回答 1

5

只捕获一些错误,将其他错误留给外部处理程序或根本没有处理程序是完全可以的。错误系统比通常使用的要灵活得多,因此要重新抛出错误,您可能会考虑创建自己的错误类型

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)
})
于 2012-10-01T15:51:24.507 回答