gpt4 book ai didi

r - 获取 R 中 tryCatch'ed 错误的堆栈跟踪

转载 作者:行者123 更新时间:2023-12-02 05:49:45 25 4
gpt4 key购买 nike

这与其他一些问题有关,但我似乎不知道如何应用答案,所以我问一个新问题。

我正在尝试从如下代码中找出无信息的错误:

tryCatch(MainLoop(), 
error=function(e) { fatal(lgr, paste('caught fatal error:', as.character(e)));
exit.status <<- 1 })

问题在于该错误似乎与隐藏在库函数中的某些内容有关:

Error in nrow(x): (subscript) logical subscript too long

nrow 不在我的代码中,因为上面的 C 级错误仅适用于在我的任何 nrow 调用中从未发生过的索引类型。

所以我真的很想从 tryCatch 中获取堆栈跟踪。这是一个类似的问题:

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 吗?有什么更好的方法吗?

最佳答案

对于交互式使用,可以trace(stop, quote(print(sys.calls())))打印stop()时的调用堆栈调用。

来自 ?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...

所以

>     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,则会受阻

withCallingHandlers({
tryCatch(x(), error=function(e) stop("oops"))
}, error=function(e) print(sys.calls()))

因为我们只有在 tryCatch“处理”错误后才能访问调用堆栈。

关于r - 获取 R 中 tryCatch'ed 错误的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com