2017-02-28 96 views
9

我需要将警告转换为错误,以便能够在上游进一步处理它(警告被吞咽在中间的某处,而我无法控制;错误不是) 。要做到这一点,我做了以下内容:`tryCatch`内的`withingCallingHandlers`创建不可捕捉的错误

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之间的几层(包括muffl的逻辑es警告)。我如何使我的调用处理程序引发的错误可以捕获?不幸的是,我无法按照in another Stack Overflow question的说明使用重新启动,因为stop没有定义重新启动,而且我仍然无法控制正在执行捕获的代码。

回答

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

+0

谢谢,这使得完美感。我实际上试图做到这一点(=打印/返回条件来检查它),但我的尝试失败了,因为它根本没有发生在我身上,该类将是'错误'以外的任何东西。咄。 –

+0

如果我能以某种方式欺骗调用堆栈信息,它会更大。不幸的是,即使使用在'warning_to_error'的'parent.frame()'中执行的'eval',我也无法实现这一点:堆栈跟踪总是以'eval'结尾。我猜这是不可能的? –

+1

创建一个错误条件对象并在将'sys.calls'的结果传递给'stop'之前将其存储在它中。 –