为了为我的同事和我的 R 脚本建立一个一致的异常处理接口(interface),我想使用以下 tryCatch 结构。
- 外部 tryCatch 包裹在给定的 R 脚本中。它用于捕获并处理需要脚本中止的 fatal error 。
- 用户脚本中特定于用户的 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/