DOWITHONESTART中的错误

DOWITHONESTART中的错误,r,debugging,try-catch,R,Debugging,Try Catch,我有一个较长、复杂的代码(>7000行),其中包含许多嵌套函数,每个函数都包含在一个单独的tryCatch中。除“伪错误”外,代码工作正常: doWithOneRestart()作为tryCatch函数的一个元素在R中是内部的。我称之为“伪错误”,因为如果发生错误,tryCatch应该导致stop(),并将错误消息写入日志文件。相反,这个“错误”并没有停止程序(实际上根本不会影响它),它只显示在控制台上,不会写入日志文件。通常的调试程序没有帮助,因为错误是不可再现的(!):它可能发生在程序的不同

我有一个较长、复杂的代码(>7000行),其中包含许多嵌套函数,每个函数都包含在一个单独的tryCatch中。除“伪错误”外,代码工作正常:

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

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

更新(2013年10月28日):
我找到了问题的根源。这与java堆溢出问题有关(我使用xlsx包读取Excel文件)。在许多其他问题中:虽然与Excel文件的连接已关闭(肯定是!),但系统将其视为未使用的连接(如
traceback()
所示),试图关闭它,但发现它已关闭:您会遇到上述“伪错误”,而且不会完全同时发生(不可复制)。在正确的位置使用垃圾收集器
gc()
解决了问题。脚本现在稳定运行了几天

彼得·达尔加德的建议

获取该消息的最简单方法是从 顶级:

您可能正在尝试从
source()
d文件
return()
。或许
source()
(无关的
'}'
字符可以做到这一点)



通常的调试策略应该有效:在错误发生后调用
traceback()
,或者设置
选项(error=recover)

谢谢Richie。调试时的问题,例如使用
回溯()
,是缺乏再现性。但我会继续努力。
Error in doWithOneRestart(return(expr), restart): no function to return from, jumping to top level 
return(1)