MadExcept + try/finally 块?

2024-01-05

我有一些delphi代码,有点像这样:

try
  //some code
  //occasionally throws an exception here, for example an EIndexOutOfRangeException
  //more code...should get skipped if exception is thrown
finally
  // there may or may not be any important cleanup code here
end;

在这种情况下,除了打破 try 块之外,不需要处理异常。因此,在将 mad- except 添加到项目中进行错误排除之前,这段代码是“有效的”。但现在我收到了错误报告,因为 MadExcept 正在报告未捕获的异常。

相关问题,MadExcept 在 try finally 时触发 https://stackoverflow.com/questions/10746927/madexcept-triggers-on-try-finally表示在这种情况下 MadExcept 中断的行为是“预期的”,因为该异常未被“处理”。

我想澄清一下我的选择是什么,以防止在运行此代码时弹出疯狂异常对话框,无论是否抛出并忽略内部异常。

所以我的想法是正确的,没有开关可以禁用 MadExcept 在 try/finally 块中中断未处理的异常?即使我想忽略它,我也需要明确地“捕获”异常?

我应该做这样的事情(忽略任何例外):

try
  //some code
  //sometimes throws EIndexOutOfRangeException here
  //more code...should get skipped if exception is thrown
except do begin end;
end;

或者也许(忽略一个非常具体的例外):

try
  //some code
  //sometimes throws EIndexOutOfRangeException here
  //more code...should get skipped if exception is thrown
except on E : EIndexOutOfRangeException do begin end;
end;

或者也许需要是:

try
  try
    //some code
    //sometimes throws EIndexOutOfRangeException here
    //more code...should get skipped if exception is thrown
  except on E : EIndexOutOfRangeException do begin end;
finally
  // some cleanup code
end;

如果这三个都是有效的解决方案,我是否应该出于某种原因更喜欢其中一个?


所以我的想法是正确的,没有开关可以禁用 MadExcept 在 try/finally 块中中断未处理的异常?

Yes. try/finally is not 异常处理; it's 保证清理,无论是否发生异常。像这样,try/finally块与 MadExcept 等异常处理工具完全无关。

即使我想忽略它,我也需要显式地“捕获”异常?

是的。这就是例外的工作原理。它们沿着堆栈向下移动,直到找到抓住它们的处理程序。如果不存在这样的处理程序,操作系统会将其解释为崩溃并终止程序。德尔福的TApplication对象在非常靠近调用堆栈底部的位置安装一个处理程序,以便您的程序不会崩溃,而 MadExcept 会挂钩它,以便如果异常到达此点,就会生成报告。

如果您想忽略异常,是的,您确实需要捕获它,因为您正在做的正式操作是“通过在堆栈展开中的此时捕获异常并忽略它来处理异常”。关于“在堆栈展开中的此时捕获它”的部分很重要,因为这意味着堆栈展开在该点停止并且程序恢复正常执行。如果您只是忽略它(即在代码中不执行任何操作,包括不安装异常处理程序),无论您是否安装了 MadExcept,它都会继续将堆栈一直展开到默认处理程序。

所以,是的,在这种情况下,示例#2 是正确的做法。如果此时您有需要执行的清理代码,则示例 #3 也有效。但例子#1在任何情况下都不应该这样做因为这意味着你最终可能会忽略你本来就存在的异常not预期,然后你的程序就会崩溃,而你却从未意识到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MadExcept + try/finally 块? 的相关文章

随机推荐