我有一些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 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块中打破未处理的异常是正确的吗?


是。 try/finally不是异常处理;无论是否发生异常,都可以保证清除。因此,try/finally块与诸如MadExcept之类的异常处理工具完全无关。


  而且即使我希望忽略该异常,我也需要明确地“捕获”该异常?


是。这就是异常的工作方式。他们沿栈向下工作,直到找到捕获它们的处理程序。如果不存在这样的处理程序,则OS会将其解释为崩溃并终止程序。 Delphi的TApplication对象在靠近调用堆栈底部的位置安装了一个处理程序,以使您的程序不会崩溃,MadExcept对此进行钩挂,以便在出现异常时生成报告。

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

是的,在这种情况下,示例2是正确的做法。如果此时需要执行清除代码,则示例#3也将有效。但是示例#1在任何情况下都不应执行,因为这意味着您可能最终会忽略一个您没有预料到的异常,然后最终在程序中出现损坏,并且您永远不会意识到它。

10-08 06:52