Delphi AV vs Try-Except

The*_*rse 1 architecture delphi error-handling try-catch

美好的一天!

我有一个使用TaskManager的多线程应用程序,工作者......我有一个问题.

线程执行方法看起来像:

try
 task.execute();
except
 on E : Exception do
 begin
   log(e.message);
   //  callResetThread/disconnectUser
 end;
end;
Run Code Online (Sandbox Code Playgroud)

每个任务都有许多访问冲突,运行时错误...尝试 - 除了某些情况没有帮助.是否有任何解决方案来保护我的程序免受线程错误的影响...

Delphi 7 /没有jedi /默认内存管理器

UPDATE

亲爱的朋友们!我们有一个包含许多第三方组件的代码.该程序在单用户模式下每周提出1-2例外.当我们修改此程序以在服务器模式下使用相同的500个客户端时,我们每天可以有> 70个例外(1-2可能是关键的而不是捕获尝试...除了......结束). 我们真的明白我们必须修复所有错误 :-).但是源代码(带有第三方组件)的大小> 20 Mb ...我们真的需要你的帮助,我们如何能够捕获这个系统错误(可能使用系统方法).

Rob*_*edy 15

Try-except不应该 "帮助"运行时错误.应该通过修复程序中的错误来提供帮助,以便首先不会发生访问冲突和其他错误.

如果发生异常并且您不知道原因,那么您的程序中无法解决问题,因此您的程序没有理由继续运行.众所周知,您的程序内存已经损坏,因此您可以做的最安全的事情就是终止程序,以免将客户的数据置于危险之中.

如果try-except块未捕获异常,那么无论你的程序是这样坏,你已经被覆盖时处理异常你的程序的一部分,或者异常发生try-except块之外.

您可以尝试使用异常日志记录库,如MadExcept,EurekaLog或JclDebug.它们检测程序中的异常并记录信息以帮助您调试问题.

另一种可能性是调试器在发生异常时中断程序并向您显示有关它的消息.这是调试器,而不是你的程序,所以如果你让程序继续运行,你会看到你的异常处理代码接管.

  • 如果"修复错误"不是解决方案,那么我什么都不怕. (8认同)
  • @TheHorse:你不是那么粗鲁,不是吗?带AV的9000个地方!它对我来说就像一个奇迹,这条错误的代码完全有用!修复它们,没有其他选择! (3认同)
  • 超过9000个已发生访问违规的地方?哎哟.无论如何,修复它们没有其他替代方法...... (2认同)
  • @TheHorse停止假装你可以逃脱这个并开始修复你的错误. (2认同)

And*_*eas 6

HAVE解决这些问题全部,真的!AV不仅是处理它的例外问题.每个异常(AV)都会使程序进入或多或少的"未定义"状态,因为您的代码试图在内存中写入或读取某些数据,并且数据无效.所以你的应用程序的结果或应该做的事情是行不通的!并且没有"不可能"!这肯定是可能的,或者你必须重写代码......


Bar*_*lly 5

获得比try/ 更高弹性的唯一方法except是使用单独的进程(之后,单独的机器,然后单独的数据中心等).

听起来您使用的代码并非设计用于线程,更不用说您将在服务器应用程序中看到的繁重的多线程.我不认为你目前的方法是可行的.