2012-02-28 51 views
4

当一个调用存在多行时,潜在的错误只包括match.call()的第一行,导致一些信息丢失和一个不完整的句子。一个简单的例子:覆盖R的不完整错误消息

#proper error message: 
runif(n=1, k=5) 

#incomplete error message: 
runif(n=1, k={5}) 

会是一个什么方式来获得R(也许通过折叠多行左右),包括完整的调用错误讯息?我最感兴趣的是在tryCatch设置中使用它。

回答

3

我了个去,在通过在tryCatch设置调查错误对象:

tryCatch(runif(n=1,k={5}), 
      error = function(e) recover()) 

然后选择第4个环境(value[[3]](cond))检查e

我注意到e$call是:

Browse[1]> e$call 
runif(n = 1, k = { 
    5 
}) 

如此看来,错误消息只使用了第一道防线。

Browse[1]> paste(deparse(e$call),collapse='') 
[1] "runif(n = 1, k = { 5})" 

所以,你可以尝试像:

您可以折叠所有线路一起

tryCatch(runif(n=1,k={5}), 
      error = function(e) { 
      cat(sprintf('Error in %s: %s\n', 
       paste(deparse(e$call),collapse=''), 
       e$message)) 
      }) 

但这并不修复了错误消息本身,就按这个龙头到它:在runif

差(n = 1,K = {5}):未使用的参数(一个或多个)(K = {

所以'xxx中的错误'是完整的,但'未使用的参数xxx'仍然不是。这是一个开始,但不是所有的方式。

我不知道如何改善这一点(也有兴趣知道是否有可能)。

+0

它似乎从内部函数geterrmessage获取错误消息;如果它在那里被截断(它似乎是),修复错误信息可能也相当困难。有关内部函数的代码,请参阅https://svn.r-project.org/R/branches/R-2-14-branch/src/main/errors.c中的函数'do_geterrmessage'。 – Aaron 2012-02-28 12:22:28