【问题标题】:Why does withCallingHandlers still throw an error?为什么 withCallingHandlers 还是会报错?
【发布时间】:2019-09-19 17:59:25
【问题描述】:
some_f <- function() {
  stop("Error")
}

t2 <- withCallingHandlers({some_f()},
         error=function(err){print("got here")},
         warning=function(warn){return(NULL)})

输出:

[1] "got here"
 Error in some_f() : Error 
3. stop("Error") 
2. some_f() 
1. withCallingHandlers({
      some_f()
   }, error = function(err) {
      print("easldfa") ... 

错误功能被激活,因为“到达这里”被打印出来了。但它仍然会抛出错误。它不应该那样做。

【问题讨论】:

  • 错误函数被激活不是因为“到了这里”被打印出来但是因为你将t2分配给some_f函数输出会抛出一个错误消息@ 987654325@。就像在try-catch 中一样,在这种情况下withCallingHandlers 将执行error 函数调用中指定的任何操作,同时抛出some_f() 函数的停止错误消息。我在这里错过了什么吗?

标签: r


【解决方案1】:

您将withCallingHandlerstryCatch 混淆了。当您使用withCallingHandlers 时,您的处理程序将被调用,然后是之前建立的任何其他处理程序,即在您的示例中,错误条件的默认处理程序。

要获得您期望的行为,请使用以下内容:

> some_f <- function() {
+   stop("Error")
+ }
> 
> t2 <- tryCatch({some_f()},
+          error=function(err){print("got here")},
+          warning=function(warn){return(NULL)})
[1] "got here"

这也会将t2 设置为"got here",因为这是print() 函数的结果。您可以将不同的值作为该错误处理程序的返回值,例如

> t2 <- tryCatch({some_f()},
+          error=function(err){print("got here"); 123},
+          warning=function(warn){return(NULL)})
[1] "got here"
> t2
[1] 123

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2013-03-24
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多