`tryCatch`中的`withCallingHandlers`会产生无法捕获的错误

时间:2017-02-28 10:53:34

标签: r error-handling

我需要将警告转换为错误,以便能够进一步向上游处理(警告被中间某处吞没,我无法控制;错误不是)。为此,我正在做以下事情:

warning_to_error = function (expr)
    withCallingHandlers(expr, warning = stop)

这很有效:

> warning_to_error(warning('foobar'))
Error in withCallingHandlers(expr, warning = stop) : foobar

不幸的是,这使错误完全无法捕获:

> try(warning_to_error(warning('foobar')))
Error in withCallingHandlers(expr, warning = stop) : foobar

In my real situation,我的warning_to_errortry之间有几个层(包括消除警告的逻辑)。如何使我的调用处理程序引发的错误可以捕获?不幸的是,我不能按照in another Stack Overflow question所述使用重启,因为stop没有定义重启,而且我再次无法控制执行捕获的代码。

1 个答案:

答案 0 :(得分:7)

这应该告诉您warning_to_error的定义:

> tryCatch(warning_to_error(warning('foobar')), condition = print)
<simpleWarning in withCallingHandlers(expr, warning = stop): foobar>```

正如stop的文档所述,当您使用条件调用stop时,会通知该条件以查找处理程序,这意味着warning处理程序。如果要调用错误处理程序,则需要发出错误信号。例如,当您设置options(warn = 2)时会发生这种情况。所以你需要像

这样的东西
warning_to_error1 <- function (expr)
    withCallingHandlers(expr,
                        warning = function(w)
                            stop("(converted from warning) ",
                                 conditionMessage(w)))

那会给你

> tryCatch(warning_to_error1(warning('foobar')),
+          error = function(e) print("Got it"))
[1] "Got it"

理想情况下,我们应该为转换为错误的警告提供条件类和构造函数,并在内部使用warn = 2