美好的一天!
我有一个带有TaskManager的多线程应用程序,工作者......我有一个问题。
线程执行方法如下:
try
task.execute();
except
on E : Exception do
begin
log(e.message);
// callResetThread/disconnectUser
end;
end;
每个任务都有许多访问冲突,运行时错误......尝试 - 除了某些情况之外没有 救命。是否有任何解决方案可以保护我的程序免受线程错误的影响...
Delphi 7 / no jedi / default memory-managers
更新
亲爱的朋友们! 我们有一个包含许多第三方组件的代码。该程序在单用户模式下每周提出1-2例外。当我们将此程序修改为在服务器模式下使用相同的500个客户端时,我们可以使用> 每天70个例外(1-2可能是关键的,没有捕获尝试......除了......结束)。 我们真的明白我们必须修复所有错误 :-)。但源代码(带有第三方组件)的大小> 20 Mb ...... 我们真的需要你的帮助,我们如何能够捕获这个系统错误(可能使用系统方法)。
答案 0 :(得分:15)
尝试 - 除了假定以“帮助”运行时错误。 您应该通过修复程序中的错误来提供帮助,以便首先不会发生访问冲突和其他错误。
如果发生异常且您不知道原因,那么您的程序中无法解决问题,因此您的程序没有理由继续运行。众所周知,您的程序内存已经损坏,因此您可以做的最安全的事情就是终止程序,以免让客户的数据处于危险之中。
如果try-except块没有捕获异常,那么你的程序所以已被破坏,你已经覆盖了处理异常的程序部分,或者异常发生在异常之外try-except block。
您可以尝试使用异常日志记录库,例如MadExcept,EurekaLog或JclDebug。它们会检测程序中的异常并记录信息,以帮助您调试问题。
另一种可能性是调试器在发生异常时中断程序并向您显示有关它的消息。这是调试器,而不是你的程序,所以如果你让程序继续运行,你会看到你的异常处理代码接管。
答案 1 :(得分:6)
你有来修复它们所有,真的! AV不仅是处理它的例外问题。每个异常(AV)都会使程序进入或多或少的“未定义”状态,因为您的代码试图在内存中写入或读取某些数据,并且数据无效。所以你的应用程序的结果或应该做的事情是行不通的!并且没有“不可能”!这肯定是可能的,或者你必须重写代码......
答案 2 :(得分:5)
获得比try
/ except
更高弹性的唯一方法是使用单独的进程(之后是单独的计算机,然后是单独的数据中心等)。
听起来您正在使用的代码并非设计用于线程,更不用说您将在服务器应用程序中看到的繁重的多线程。我不认为你目前的方法是可行的。