在R中的tryCatch'ed错误中获取堆栈跟踪 [英] get stack trace on tryCatch'ed error in R
问题描述
这与其他一些问题有关,但我似乎无法弄清楚如何应用答案,所以我在问一个新问题。
This is related to some other questions, but I can't seem to figure out how to apply the answer, so I'm asking a new question.
我试图从一段看起来像这样的代码中找出一个不知情的错误:
I'm trying to figure out an uninformative error from a piece of code that looks like this:
tryCatch(MainLoop(),
error=function(e) { fatal(lgr, paste('caught fatal error:', as.character(e)));
exit.status <<- 1 })
问题是该错误似乎与库函数中隐藏的东西有关:
The problem is that the error appears to be related to something buried in a library function:
Error in nrow(x): (subscript) logical subscript too long
nrow
不在我的代码中,因为上面的C级错误只适用于一种从未发生过的索引在任何我的 nrow
调用。
That nrow
is not in my code, as the C-level error above only applies to a type of indexing that never happens in any of my nrow
calls.
所以我真的很想从那个 tryCatch
。这是一个类似的问题:
So I'd really like to get a stack trace from within that tryCatch
. Here's an analogous problem:
x <- function() { y(); }
y <- function() { z(); }
z <- function() { stop("asdf") }
> x()
Error in z() : asdf
> tryCatch(x(), error=function(e) { print(conditionCall(e)) } )
z()
> tryCatch(x(), error=function(e) { dump.frames() } )
> last.dump
$`tryCatch(x(), error = function(e) {
dump.frames()
})`
<environment: 0x1038e43b8>
$`tryCatchList(expr, classes, parentenv, handlers)`
<environment: 0x1038e4c60>
$`tryCatchOne(expr, names, parentenv, handlers[[1]])`
<environment: 0x1038e4918>
$`value[[3]](cond)`
<environment: 0x1038ea578>
attr(,"error.message")
[1] "asdf"
attr(,"class")
[1] "dump.frames"
如何获取包含调用 y()的堆栈跟踪,
?我必须停止使用 tryCatch
?什么是更好的方法?
How do I get the stack trace that includes the call to y()
? Do I have to stop using tryCatch
? What's a better way?
推荐答案
对于交互式使用可能 trace(stop,quote(print .calls())))
在 stop()
调用时打印调用堆栈。
For interactive use one might trace(stop, quote(print(sys.calls())))
to print the call stack at the time stop()
is invoked.
从?tryCatch
,
The function 'tryCatch' evaluates its expression argument in a
context where the handlers provided in the '...' argument are
available.
而
Calling handlers are established by 'withCallingHandlers'...
the handler is called... in the context where the condition
was signaled...
so
> withCallingHandlers(x(), error=function(e) print(sys.calls()))
[[1]]
withCallingHandlers(x(), error = function(e) print(sys.calls()))
[[2]]
x()
[[3]]
y()
[[4]]
z()
[[5]]
stop("asdf")
[[6]]
.handleSimpleError(function (e)
print(sys.calls()), "asdf", quote(z()))
[[7]]
h(simpleError(msg, call))
Error in z() : asdf
如果有一个内部的tryCatch
This is thwarted if there is an inner tryCatch
withCallingHandlers({
tryCatch(x(), error=function(e) stop("oops"))
}, error=function(e) print(sys.calls()))
,因为我们只有在tryCatch处理错误后才能访问调用堆栈。
as we only have access to the call stack after the tryCatch has 'handled' the error.
这篇关于在R中的tryCatch'ed错误中获取堆栈跟踪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!