4

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

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

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

有什么方法可以让 R 包含对错误消息的完整调用(可能通过折叠多行左右)?我最感兴趣的是在 tryCatch 设置中使用它。

4

1 回答 1

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}):未使用的参数(s)(k = {

所以“xxx 中的错误”是完整的,但“未使用的参数 xxx”仍然没有。这是一个开始,但并非一直如此。

我不确定如何改进这一点(并且我也有兴趣知道它是否可能)。

于 2012-02-28T05:45:56.303 回答