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;
如果所有这三个都是有效的解决方案,我是否应该出于任何原因而优先选择其中一个?
So I’m correct in thinking there’s no switch to disable MadExcept from breaking on unhanded exceptions in a try/finally block?
是. try / finally不是异常处理;无论是否发生异常,都可以保证清理.因此,try / finally块与诸如MadExcept之类的异常处理工具完全无关.
And I’m going to need to explicitly “catch” the exception even if I wish to ignore it?
是.这就是异常的工作方式.它们沿着堆栈向下工作,直到找到捕获它们的处理程序.如果不存在这样的处理程序,则操作系统将其解释为崩溃并终止程序. Delphi的TApplication对象安装一个非常靠近调用堆栈底部的处理程序,这样你的程序就不会崩溃,而MadExcept会挂钩它,这样如果异常到达这一点,就会生成一个报告.
如果你想忽略一个异常,是的,你确实需要捕获它,因为你正在做的是正式“通过在堆栈的这一点上捕获异常并忽略它来处理异常”.关于“在堆栈展开时捕获它”的那一部分很重要,因为它意味着堆栈展开在该点停止并且程序恢复正常执行.如果你只是忽略它,(即在你的代码中没有做任何事情,包括不安装异常处理程序),它将继续将堆栈一直展开到默认处理程序,无论你是否安装了MadExcept.
所以是的,在这种情况下,例子#2是正确的行动方案.示例#3也是有效的,如果你有需要在此时执行的清理代码.但是示例#1永远不应该在任何情况下完成,因为这意味着你最终可能会忽略一个你没有预料到的异常,然后你最终会在你的程序中出现腐败而你永远不会意识到它.