R - 在自定义错误处理程序中从基础环境访问.Traceback

时间:2014-12-12 20:28:40

标签: r error-handling

我正在编写一个自定义错误处理程序(使用error选项),主要用于与source一起运行的程序。在自定义错误处理程序中,我想计算导致错误的源文件的行号。

通常,每当抛出错误时,基本环境中的.Traceback都会被修改为包含导致错误的调用堆栈。此外,直接存在于源文件中的调用将被赋予类srcref的属性,该属性包含有关文件中调用位置的信息。

但是,似乎.Traceback在自定义错误处理程序结束之后才设置,这意味着我不能依赖它来查找导致错误的代码的行号。

有没有办法获得traceback在自定义错误处理程序中生成的相同信息?我知道我可以sys.calls来获取调用堆栈,但这不包括有关源的信息。

1 个答案:

答案 0 :(得分:1)

?traceback中的警告部分说:“它是未记录的,.Traceback存储在哪里,也不可见,这可能会发生变化。”所以你不应该依赖那个变量。相反,您应该执行?traceback建议(并提供和示例),并使用整数计数来跳过它来调用它。

foo <- function(x) { print(1); bar(2) }
bar <- function(x) { x + a.variable.which.does.not.exist }
foo(2) # gives a strange error
# [1] 1
# Error in bar(2) : object 'a.variable.which.does.not.exist' not found

# This will print the stack trace at the time of the error.
options(error = function() traceback(2))
foo(2)
# [1] 1
# Error in bar(2) : object 'a.variable.which.does.not.exist' not found
# 2: bar(2) at #1
# 1: foo(2)