我有一个Delphi 6客户端 - 服务器应用程序,其中服务器本质上是:
initialize;
repeat
try
getInput;
putOutput;
except
on e: exception do writeln(e.message);
end
until false;
Run Code Online (Sandbox Code Playgroud)
在开发过程中,错误(例如指针异常)很少见,但服务器可以继续运行.现在,它的生产服务器似乎调试和人们很容易去除try...except,因为它增加了大量的执行对服务器的开销,但随后如有异常要发生,将停止服务器.
一个解决办法是有一个父进程只需重新启动整个服务器,并在重新启动绕过初始化将有效地重现了什么try...except成就,但也不会有什么导致异常的任何记录,并且有或没有初始化重启实际上创造了很多不需要的"状态"问题,特别是与客户端连接.
有没有办法覆盖或修改异常处理,以便在异常发生时将其记录到某个地方(例如在系统事件日志或%errorlevel%中),然后程序退出并重新启动或(更好:)恢复,但没有开销无所不包的try...except?
理想的解决方案将记录异常,但恢复执行的级别repeat...until.也许通过执行诸如保存repeat某些可访问全局的地址之类的内容,然后进行任何异常来解除调用堆栈并在该保存的地址恢复?(我猜这try..except本质上是什么,但是有没有办法避免在没有例外情况下它所施加的开销?)
扩展Serg的建议:
repeat
try
repeat
getInput;
putOutput;
until false;
except
on e: exception do writeln(e.message);
end
until false;
Run Code Online (Sandbox Code Playgroud)
具有相同的行为但移动try .. except到最里面的循环外部.
但是,如果这对性能产生任何明显的影响,我会感到惊讶.