如何重新显示R中的错误?
我将使用捕获错误,并尝试处理该错误。但是,如果我不能在本地处理错误(即委托给调用堆栈中更高级别的父函数的错误处理程序),我如何重新显示错误 我尝试使用,但没有看到rethrown错误,我看到的是如何重新显示R中的错误?,r,error-handling,try-catch,R,Error Handling,Try Catch,我将使用捕获错误,并尝试处理该错误。但是,如果我不能在本地处理错误(即委托给调用堆栈中更高级别的父函数的错误处理程序),我如何重新显示错误 我尝试使用,但没有看到rethrown错误,我看到的是NULL: > error.can.be.handled <- function(e) F > > foo <- function() stop("foo stop!") > tryCatch(foo(), + error = function(e) { +
NULL
:
> error.can.be.handled <- function(e) F
>
> foo <- function() stop("foo stop!")
> tryCatch(foo(),
+ error = function(e) {
+ if (error.can.be.handled(e)) {
+ # handle error
+ }
+ else
+ signalCondition(e) # Rethrow error
+ }
+ )
NULL # I expected to see 'Error in foo() : foo stop!' here
>error.can.be.handled
>foo-tryCatch(foo(),
+错误=函数(e){
+if(可处理的错误(e)){
+#处理错误
+ }
+否则
+信号条件(e)#返回错误
+ }
+ )
NULL#我希望看到“foo()中的错误:foo stop!”在这里
出什么问题了?在signalCondition()中没有任何必要:
tryCatch(foo(),
error = function(e) {
if (error.can.be.handled(e)) {
# handle error
}
else
e # Rethrow error
}
)
<simpleError in foo(): foo stop!>
tryCatch(foo(),
错误=函数(e){
if(可处理的错误(e)){
#处理错误
}
其他的
e#回缩误差
}
)
将重新发出停止条件的信号,尽管上下文已丢失
> tryCatch(stop("oops"), error=function(e) stop(e))
Error in doTryCatch(return(expr), name, parentenv, handler) : oops
> traceback()
5: stop(e)
4: value[[3L]](cond)
3: tryCatchOne(expr, names, parentenv, handlers[[1L]])
2: tryCatchList(expr, classes, parentenv, handlers)
1: tryCatch(stop("oops"), error = function(e) stop(e))
> tryCatch(stop("oops"))
Error in tryCatchList(expr, classes, parentenv, handlers) : oops
> traceback()
3: stop("oops")
2: tryCatchList(expr, classes, parentenv, handlers)
1: tryCatch(stop("oops"))
按照@tonytonov的建议只返回
e
,并不表示出现了某种情况,但并不表示出现了错误。有一种解决方法,可以用来避免捕获并重新抛出错误。基本上,只有当相关代码失败时,才使用带有on.exit
处理程序的成功标志来运行代码块:
foo <- function() stop("foo stop!")
runFoo <- function() {
success <- FALSE
on.exit({
if (!success) {
## Handle failure
}
})
result <- foo()
success <- TRUE
result
}
runFoo()
foo谢谢,但是这个示例只是返回错误对象e
,而不是抛出它。请注意,如果将示例包装到另一个函数中,它将以静默方式运行,而重试错误仍将停止执行并在foo()中打印错误:foo stop代码>啊,对。Martin的回答纠正了这一点:stop(e)实际上在做这项工作。@Martin Morgan的回答是正确的,不过为了补充更多细节,您的版本不起作用,因为stop
,除了发出条件信号外,还输出错误消息,并通过调用abort restart中止执行。因此,可见的“错误”实际上与默认错误处理程序无关,它只是stop
中的代码,这就是为什么需要调用stop
来实现这一点,而信号条件是不够的。有关详细信息,请参阅stop
source。如果希望保留上下文,请使用和CallingHandlers
而不是tryCatch
。
foo <- function() stop("foo stop!")
runFoo <- function() {
success <- FALSE
on.exit({
if (!success) {
## Handle failure
}
})
result <- foo()
success <- TRUE
result
}
runFoo()