Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何重新显示R中的错误?_R_Error Handling_Try Catch - Fatal编程技术网

如何重新显示R中的错误?

如何重新显示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) { +

我将使用捕获错误,并尝试处理该错误。但是,如果我不能在本地处理错误(即委托给调用堆栈中更高级别的父函数的错误处理程序),我如何重新显示错误

我尝试使用,但没有看到rethrown错误,我看到的是
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()