【问题标题】:Get call on errors on top level?获取关于顶级错误的电话?
【发布时间】:2012-06-23 21:15:03
【问题描述】:

当我使用tryCatch 时,我可以定义一个错误处理程序并使用conditionCall 来确定导致错误的调用。例如,

tryCatch(
    eval(parse(text="prnit('Hello')")),
    error=function(e) {
      cl <- conditionCall(e)
      #...
    })

我可以在 R 提示符下进行错误调用吗?到目前为止,我只找到了这个解决方案:

> err_hdl  <- function() {
    file1 <- tempfile("Rrawhist")
    savehistory(file1)
    rawhist <- readLines(file1)
    unlink(file1)

    cat("Error : ", tail(rawhist,1), "\n")
    return(TRUE)    
}
> options(error=err_hdl)
> prnit("Hello")

但我相信一定有更直接的方法..

感谢任何提示!

我放了一笔赏金。将接受第一个实现上述err_hdl 函数行为的答案,该答案没有独立于平台的文件 I/O。

编辑——上面的代码似乎只适用于 Windows。我正在寻找引发错误的输入。

【问题讨论】:

  • 第一个例子没有错误。
  • 您在第一个示例中的意思更像这样,对吧? tryCatch( eval(parse(text=prnit('Hello'))), error=function(e) {conditionCall(e)})
  • @Josh O'Brien 是的,你是对的。改变了问题。
  • @kohske 问题是我不能将tryCatch 用于我在 R 控制台中输入的命令。我正在为交互式会话寻找自定义错误捕获机制。
  • FWIW,关于您的编辑,err_hdl 函数应该与平台无关,因为您的 err_hdl 函数的第一 4 行与 history 函数的第一 4 行相同。

标签: r error-handling


【解决方案1】:

看起来dump.frames 可以被告知不要转储到文件,而是转储到.GlobalEnv 中的对象。但是,除了 Mac 之外,我还没有在其他任何设备上测试过它。以下有帮助吗?

err_hdl2 <- function() {
  dump.frames("theErr", to.file = FALSE)
  cat("What happened?\n", attr(theErr,"error.message"), "\nOh.\n")
}
options(error = err_hdl2)

> prnit(dt)
Error: could not find function "prnit"
What happened?
 Error: could not find function "prnit"

Oh.

我想,在全局环境中创建对象 theErr 可能会有一个缺点。

> theErr
$`function () 
{
    dump.frames("theErr", to.file = FALSE)
    cat("What`
<environment: 0x1030fe140>

attr(,"error.message")
[1] "Error: could not find function \"prnit\"\n"
attr(,"class")
[1] "dump.frames"

【讨论】:

  • 感谢dump.frames 的提示,这对我来说是一个新功能。我可以找到导致错误的输入吗,即在示例中输入prnit(dt)
  • @KarstenW.,我不确定我理解你所说的“到达”是什么意思。你想用prnit(dt)做什么?
  • 啊,是不是错误信息只返回了它找不到的函数,而不是产生它的完整代码行?
  • @KarstenW.,我想我明白你的意思,但由于你的例子中的tail(rawhist,1) 没有在这台机器上返回任何有意义的东西,所以它仍然是一个猜测。我看看明天能不能取得进展。
  • @KarstenW.,遗憾的是没有进展报告,除了添加一个任务回调来保存用户输入的最后一个表达式,如描述的here 似乎没有保存产生错误的表达式.但你可能已经发现了。
猜你喜欢
  • 2015-03-16
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2018-06-08
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多