delphi - 是否有一种无需尝试就可以有效地对程序进行防弹的方法?

标签 delphi exception

我有一个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/

相关文章:

delphi - 如何使用Delphi在dll项目中获取主机应用程序句柄而不传递句柄参数

Java 并发修改异常

PHP,如何捕捉除以零?

java - UncaughtExceptionHandler 没有捕获到一些异常

delphi - 删除有关已声明但未使用的符号的编译器警告

delphi - 是否可以使用 JclDebug 从引发异常的方法中获取参数值?

delphi - 将滚动条隐藏在 Delphi dbgrid 中(即使在调整大小时)

c# - 如何拦截 "Could not load file or assembly"?

exception - grails异常:标记[paginate]缺少必需的属性[total]

delphi - 无法解析的外部 UrlCombineW