我可以使用获得最后计算的值 .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对象.
如果您是代码的作者,解决此问题的现代方法是使用该rlang包。您可以使用 引发错误abort(),然后使用 检索最后一个错误last_error()。
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\nRun Code Online (Sandbox Code Playgroud)\n\n这样做的限制是它不能处理stop().
根据 David Arenburg 的评论,您可以tryCatch()与回溯结合使用。
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}\nRun 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): @@@>\nRun Code Online (Sandbox Code Playgroud)\n\n一个限制:
\n\n当您重新评估错误代码时,所有变量都需要可用。所以下面的例子不起作用,例如:
\n\ng <- 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">\nRun Code Online (Sandbox Code Playgroud)\n\n通过设置options(error = dump.frames),错误时的调用堆栈将存储last.dump在全局环境中命名的变量中。环境last.dump[length(last.dump)]有时包含错误对象,有时包含会创建错误的参数。
debugger(last.dump)允许对堆栈进行交互式事后探索,作为错误对象的替代方法。