如何在Delphi中禁用所有异常抛出?

4

有没有办法在异常或错误发生时(如访问冲突、Indy套接字错误、超时等)禁用所有对话框?这些错误有时会在我的程序中抛出,但这些错误并不会对程序造成致命影响,可以忽略,只是对话框非常烦人。我使用的是Delphi 7。


3
你可以捕捉所有的异常,但这完全是错误的,编写这样的代码是缺乏专业精神的表现。访问冲突总是出现了问题,应该进行处理。 - LukLed
10
难道您没有想过修复程序中的漏洞可能会更好吗?暗示可以忽略访问冲突是非常奇怪的。您的程序有缺陷,适当的行动是修复它们。 - David Heffernan
你说得对,可能是其他问题引起的访问冲突(我不记得了,这种情况很少发生)。我知道它有很多漏洞,就像一个做一些类似于众包重复任务的机器人的0.1预阿尔法版本,有很多漏洞,但它已经在完成它的工作。我只是想要一个临时解决方案,在我优化所有事情之前更无缝地运行它。无论如何,谢谢你的回答。 - user1262737
@user1262737请考虑上下文中的所有内容(包括评论和答案),否则您的应用程序将继续变得复杂,到某个时候重写比继续使用更便宜。 - user497849
1
只是为了支持其他人的观点 - 修复错误!这是唯一的进步方式。充分利用异常 - 我目前的嵌入式工作没有异常处理,定位关键错误非常痛苦。 - Martin James
显示剩余2条评论
4个回答

7
如果您不想显示异常窗口,可以前往:工具/选项/调试器选项/语言异常并禁用 通知语言异常 复选框。这适用于 Delphi 2010。(我不记得在 Delphi 7 中是否有相同的复选框。)
编辑: 在某些情况下,异常是不可避免的,特别是当我们使用来自互联网的未知文件时。因此,我相信您在 Indy 下已经正确处理了异常,只需关闭通知语言异常即可。

4
在 Delphi 7 中,类似的操作是:工具 --> 调试选项 --> 语言异常 --> 取消勾选 '停止在 Delphi 异常处'。 - Hendra

5

您可以自定义 Application.OnException 事件。但在我看来...

  • Application.OnException 最适合记录您忘记处理的异常。
  • 仅当您迫切需要性能时(在这种情况下,您应该预期执行路径已中断),才应使用 Application.OnException 来捕获异常。

另外:

  • 访问冲突是致命错误-您必须跟踪并消除所有 AV。
  • 您无法仅通过 Application.OnException 覆盖来隐藏异常对话框-您应该正确使用 try finally/except。

你不能简单地将异常藏起来,应该正确使用try finally/except。而正确的方法并不是使用try/except..... - David Heffernan
3
如果你使用得当,try/except是完全有效的。例如,不要用它来掩盖所有异常而不加区分地使用try...except end;而是要真正处理不同的异常情况。 - Harriv
1
@DavidHeffernan:你是指尝试{...}除了{处理任何可能的异常}结束,还是try {} except on E: ESpecificException do {仅处理特定异常}结束有问题?我不知道吗? - g2mk
为什么要处理异常?让它浮到顶层异常处理程序并在那里处理。有时候会有例外,但这是起点。 - David Heffernan
@DavidHeffernan:所谓“悄悄处理”,我是指通过Application.OnException覆盖来隐藏异常对话框,但你说得有道理。我明天会改进我的答案... - g2mk
1
@DavidHeffeman - 在我看来,try/except是一种有效的编程工具,就像其他语句一样。我使用它来确定在某个计算中哪些数据集是有效的。如果计算出现异常,那么数据集就是无效的。否则,数据集就是有效的。这是一个处理大量数据集并标记正确数据集的好方法。 - Arnold

2
绕过Application.OnException事件。但是我不建议隐藏每个异常,个人认为这是一种糟糕的设计。

0

@ GJ - Delphi 2007有该复选框。但是,正如上面提到的那样,访问冲突不是应该忽略的异常类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接