r - R 中的异常处理和堆栈展开

标签 r exception stack-unwinding

为了为我的同事和我的 R 脚本建立一个一致的异常处理接口(interface),我想使用以下 tryCatch 结构。

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

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

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

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

然后 throw 和/或处理它

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)
})

关于r - R 中的异常处理和堆栈展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12672351/

相关文章:

r - 一次旋转更长的十二列

r - 有没有办法绘制障碍模型结果 pscl 包或绘制计数 - r 中障碍模型的零截断 negbin 部分?

r - 在同一轴上绘制年份和月份

java - 如何停止在Java Sockets中第二次写入对象时出现streamcurrrupted异常

c++ - 在抛出的异常中销毁临时字符串

c - 如何在 SIGSEGV 上使用 _Unwind_Backtrace 获取 fullstacktrace

r - 如何将数据帧转换为时间序列?

c - 访问冲突,读取指针数组时出现未处理的异常

ios - native 链接错误无法为 XXX 创建紧凑展开,不使用标准框架 (MT5209)

c++ - 是否有任何技巧可以检测在执行另一个析构函数期间是否创建了一个对象?