3

我有一个更长、更复杂的代码(>7000 行),其中包含许多嵌套函数,每个函数都包含在一个单独的 tryCatch 中。除了“伪错误”之外,该代码运行良好:

Error in doWithOneRestart(return(expr), restart): no function to return from, jumping to top level 

doWithOneRestart()在 R 中作为 tryCatch 函数的元素是内部的。我称之为“伪错误”,因为stop()如果发生错误,tryCatch 应该导致并将错误消息写入日志文件。相反,这个“错误”并没有停止程序(实际上根本没有影响它),它只显示在控制台上,而不是写入日志文件。通常的调试程序没有帮助,因为错误是不可重现的(!):它可能发生在程序的不同处理阶段。将警告选项更改为 0 或 -1 将无济于事。

由于程序完成了这项工作,因此这个错误并不严重。但我想了解发生了什么。也许有人已经遇到过同样的问题,或者可以想出一个原始的调试策略......

更新(28.10.2013): 我发现问题出在哪里。它与 java 堆溢出问题有关(我使用 xlsx 包读取 Excel 文件)。在许多其他问题中:虽然与 Excel 文件的连接已关闭(绝对!),但系统将其视为未使用的连接(如图所示traceback()),尝试关闭它,但发现它已关闭:您得到“伪-error”,并且永远不会完全在同一时刻(不可重现)。在正确的地方使用垃圾收集器gc()解决了这个问题。该脚本现在稳定运行了几天。

4

1 回答 1

1

Peter Dalgaard关于 R-help 的建议。

获取该消息的最简单方法是从顶层执行 return():

return(1) 

您可能正在尝试return()source()d 文件。或者可能 source()ing 一些打算在函数体内的东西(无关的'}'字符可以做到这一点)。


通常的调试策略应该起作用:在错误后调用traceback(),或者设置options(error = recover).

于 2013-10-22T09:23:36.313 回答