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