我正在编写一个自定义错误处理程序(使用error
选项),主要用于与source
一起运行的程序。在自定义错误处理程序中,我想计算导致错误的源文件的行号。
通常,每当抛出错误时,基本环境中的.Traceback
都会被修改为包含导致错误的调用堆栈。此外,直接存在于源文件中的调用将被赋予类srcref
的属性,该属性包含有关文件中调用位置的信息。
但是,似乎.Traceback
在自定义错误处理程序结束之后才设置,这意味着我不能依赖它来查找导致错误的代码的行号。
有没有办法获得traceback
在自定义错误处理程序中生成的相同信息?我知道我可以sys.calls
来获取调用堆栈,但这不包括有关源的信息。
答案 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)