我有一个Delphi 6客户端服务器应用程序,其中服务器实质上是:
initialize;
repeat
try
getInput;
putOutput;
except
on e: exception do writeln(e.message);
end
until false;
在开发过程中,错误(例如指针异常)很少见,但服务器将能够继续运行。现在,它已经投入生产,服务器似乎已调试完毕,并且很想删除
try...except
,因为它增加了服务器的大量执行开销,但是如果发生异常,它将停止服务器。一种解决方案是让父进程简单地重新启动整个服务器,而在重新启动时绕过初始化将有效地重现
try...except
完成的操作,但是不会有任何记录导致异常的原因,并且无论是否实际进行初始化都可以重新启动会产生很多不必要的“状态”问题,尤其是与客户端连接时。有什么方法可以覆盖或修改异常处理,以便在异常发生时将其记录在程序退出并重新启动或(更好:)恢复之前的某个位置(例如,在系统事件日志或%errorlevel%中),但不会产生开销无所不包的
try...except
?理想的解决方案将记录异常,但在
repeat...until
级别恢复执行。也许通过执行类似的操作,例如将repeat
的地址保存在某个可访问的全局变量中,然后使异常退出调用堆栈并在该保存的地址处恢复,是否会发生异常? (我想这是try..except
本质上的功能,但是有没有一种方法可以避免在没有异常的情况下它造成的开销呢?)
最佳答案
扩展塞尔格的建议:
repeat
try
repeat
getInput;
putOutput;
until false;
except
on e: exception do writeln(e.message);
end
until false;
具有相同的行为,但将
try .. except
移动到最内部的循环之外。但是,如果这对性能有任何明显的影响,我会感到惊讶。
关于delphi - 是否有一种无需尝试就可以有效地对程序进行防弹的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33093615/