如何获取最后一个错误

Ric*_*ton 6 error-handling r

我可以使用获得最后计算的值 .Last.value

2 + 2
## [1] 4
.Last.value
## [1] 4
Run Code Online (Sandbox Code Playgroud)

我可以使用最新的警告last.warning.

warning("!!!")
## Warning message:
## !!! 
last.warning
## $`!!!`
##  NULL
Run Code Online (Sandbox Code Playgroud)

我可以使用获取最新错误消息的文本 geterrmessage()

stop("!!!")
## Error: !!!
geterrmessage()
## [1] "Error: !!!\n"
Run Code Online (Sandbox Code Playgroud)

如果我事先知道可能会抛出错误,我可以使用它tryCatch来返回错误对象.

tryCatch(stop("!!!"), error = identity)
## <simpleError in doTryCatch(return(expr), name, parentenv, handler): !!!>
Run Code Online (Sandbox Code Playgroud)

在抛出之后,如何将最后一个错误检索为对象?

例如,如果我输入

stop("!!!")
Run Code Online (Sandbox Code Playgroud)

然后我希望能够输入getlasterror()或类似并检索一个simpleError对象.

Ric*_*ton 2

现代方式

\n\n

如果您是代码的作者,解决此问题的现代方法是使用该rlang包。您可以使用 引发错误abort(),然后使用 检索最后一个错误last_error()

\n\n\n\n
library(rlang)\nf <- function() {\n  abort("@@@")\n}\nf()\n## Error: @@@\nlast_error()\n## <error>\n## message: @@@\n## class:   `rlang_error`\n## backtrace:\n##  \xe2\x94\x80base::withCallingHandlers(...)\n##  \xe2\x94\x80global::f()\n## Call `summary(rlang::last_error())` to see the full backtrace\ng <- function() {\n  msg <- "###"\n  abort(msg)\n}\ng()\n## Error: ###\nlast_error()\n## <error>\n## message: ###\n## class:   `rlang_error`\n## backtrace:\n##  \xe2\x94\x80base::withCallingHandlers(...)\n##  \xe2\x94\x80global::g()\n## Call `summary(rlang::last_error())` to see the full backtrace\nh <- function() {\n  err_fn <- abort\n  err_fn("$$$")\n}\nh()\n## Error: $$$\nlast_error()\n## <error>\n## message: $$$\n## class:   `rlang_error`\n## backtrace:\n##  \xe2\x94\x80base::withCallingHandlers(...)\n##  \xe2\x94\x80global::h()\n## Call `summary(rlang::last_error())` to see the full backtrace\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样做的限制是它不能处理stop().

\n\n
\n\n

原来的答案

\n\n

根据 David Arenburg 的评论,您可以tryCatch()与回溯结合使用。

\n\n
get_last_error <- function()\n{\n  tr <- .traceback()\n  if(length(tr) == 0)\n  {\n    return(NULL)\n  }\n  tryCatch(eval(parse(text = tr[[1]])), error = identity)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

例子:

\n\n
# before an error is thrown\nget_last_error()\n## NULL\n\n# after an error at the top level\nstop("!!!")\n## Error: !!!\nget_last_error()\n## <simpleError in eval(expr, envir, enclos): !!!>\n\n# after an error inside a function\nf <- function() stop("@@@")\nf()\n## Error in f() : @@@\nget_last_error()\n## <simpleError in eval(expr, envir, enclos): @@@>\n
Run Code Online (Sandbox Code Playgroud)\n\n

一个限制:

\n\n

当您重新评估错误代码时,所有变量都需要可用。所以下面的例子不起作用,例如:

\n\n
g <- function()\n{\n  msg <- "###"\n  stop(msg)\n}\n\ng()\n## Error in g() : ###\nget_last_error()\n## <simpleError in stop(msg): object \'msg\' not found>\n\nh <- function()\n{\n  err_fn <- stop\n  err_fn("$$$")\n}\n\nh()\n## Error in h() : $$$\nget_last_error()\n## <simpleError in eval(expr, envir, enclos): could not find function "err_fn">\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

通过设置options(error = dump.frames),错误时的调用堆栈将存储last.dump在全局环境中命名的变量中。环境last.dump[length(last.dump)]有时包含错误对象,有时包含会创建错误的参数。

\n\n

debugger(last.dump)允许对堆栈进行交互式事后探索,作为错误对象的替代方法。

\n