我需要将警告转换为错误,以便能够进一步向上游处理(警告被中间某处吞没,我无法控制;错误不是)。为此,我正在做以下事情:
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_error
和try
之间有几个层(包括消除警告的逻辑)。如何使我的调用处理程序引发的错误可以捕获?不幸的是,我不能按照in another Stack Overflow question所述使用重启,因为stop
没有定义重启,而且我再次无法控制执行捕获的代码。
答案 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