【问题标题】:Delphi AV vs Try-Except [closed]Delphi AV vs Try-Except [关闭]
【发布时间】:2011-05-25 14:29:33
【问题描述】:

美好的一天!

我有一个带有 TaskManager 的多线程应用程序,工作人员......我有一个问题。

线程执行方法如下:

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

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

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

更新

亲爱的朋友们! 我们有一个包含许多第三方组件的代码。该程序在单用户模式下每周引发 1-2 次异常。当我们修改这个程序以在服务器模式下工作时,我们可以有 > 每天 70 个异常(1-2 可能是关键的并且没有被捕获 try ... except ...end) . 我们真的明白我们必须修复所有错误 :-)。但是源代码(带有第三方组件)的大小> 20 Mb ... 我们真的需要您的帮助,我们如何捕获此系统错误(可能与使用系统方法有关)。

【问题讨论】:

  • 我怀疑您的“callResetThread/disconnectUser”正在提高 A/V。
  • 读取或写入无效内存地址时会发生访问冲突。简单地说,停止这样做!
  • 总而言之,你有 100 000 行代码在 9000 个不同的地方抛出异常。也就是说,每 11 行代码中就有 1 行可能引发异常。这以每 20 分钟 1 个异常的速度进行。该代码支持 500 个客户。我不认为你是诚实的,所以我会给-1。祝你找到灵丹妙药。
  • 我也投了赞成票。 “告诉我如何隐藏我的问题”不是一个真正的问题。
  • 首先杀死你所有的尝试/除了解决方法。然后仔细查看显示的错误对话框中的文本。如果幸运的话,您搜索此文本的字符串部分将在您使用的组件源中显示结果。然后,您将能够找到需要修改的部分组件。甚至更好地用更好的替代品替换该组件。这是我的一台 OPC 服务器的解决方案,该服务器在服务器上繁重工作 2-3 周后出现奇怪错误。这是有缺陷的 AsyncPro TCP 客户端组件。

标签: delphi architecture error-handling try-catch


【解决方案1】:

Try-except 不应该“帮助”解决运行时错误。 您应该通过修复程序中的错误来提供帮助,这样一开始就不会发生访问冲突和其他错误。

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

如果 try-except 块没有捕获异常,那么您的程序因此损坏,您已经覆盖了程序中处理异常的部分,或者异常发生在try-except 块。

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

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

【讨论】:

  • 我知道程序损坏的原因,我知道为什么以及在哪里可以访问紫罗兰色和其他错误。但超过9000例。我将修复流行的错误,并且我需要捕获许多不受欢迎的错误的机制。附:不是调试器问题
  • 超过 9000 个发生访问违规的已知地点?哎哟。无论如何,除了修复它们没有真正的选择......
  • @TheHorse 不要再假装你可以摆脱这个并开始修复你的错误。
  • 如果“修复错误”不是解决方案,那么我担心什么都不是。
  • @TheHorse:你对此并不认真,不是吗? 9000 个有 AV 的地方!对我来说,这似乎是一个奇迹,这段错误的代码做了一些有用的事情!修复它们,别无选择!
【解决方案2】:

必须修复它们所有,真的! AV 不仅是一个异常处理的问题。每个异常 (AV) 都会使您的程序进入或多或少的“未定义”状态,因为您的代码试图将一些数据写入/读取内存并且数据无效。所以你的应用程序的结果或它应该做的事情是行不通的!而且没有“不可能”!这肯定是可能的,否则你必须重写代码......

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2016-08-30
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多