我有一些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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下的例外情况不需要处理超出try块的处理.因此,在将mad-except添加到项目中以进行错误故障排除之前,此代码"正常工作".但现在我收到错误报告,因为MadExcept报告了未捕获的异常.
相关问题,MadExcept触发器尝试最终表明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;
Run Code Online (Sandbox Code Playgroud)
或者(忽略一个非常具体的例外):
try
//some code
//sometimes throws EIndexOutOfRangeException here
//more code...should get skipped if exception is thrown
except on E : EIndexOutOfRangeException do begin end;
end;
Run Code Online (Sandbox Code Playgroud)
或者它可能需要:
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;
Run Code Online (Sandbox Code Playgroud)
如果所有这三个都是有效的解决方案,我是否应该出于任何原因而优先选择其中一个?
所以我认为没有开关禁止MadExcept打破try/finally块中的无法处理的异常?
是. try/finally不是异常处理 ; 无论是否发生异常,都可以保证清理.因此,try/finally块与MadExcept等异常处理工具完全无关.
即使我想忽略它,我还是需要明确地"捕获"异常?
是.这就是异常的工作方式.它们沿着堆栈向下工作,直到找到捕获它们的处理程序.如果不存在这样的处理程序,则操作系统将其解释为崩溃并终止程序.Delphi的TApplication对象安装了一个处理器非常接近调用堆栈的底部,这样你的程序将不会崩溃,并MadExcept挂钩这一点,以便如果有异常了这一点,就会生成报告.
如果你想忽略一个例外,是的,你需要抓住它,因为你在做什么是正式"的使用在这点在堆栈展开追赶它,忽略它处理异常." 关于"在堆栈展开时捕获它"的那一部分很重要,因为它意味着堆栈展开在该点停止并且程序恢复正常执行.如果你只是忽略它,(即在你的代码中没有做任何事情,包括不安装异常处理程序),它将继续将堆栈一直展开到默认处理程序,无论你是否安装了MadExcept.
所以是的,在这种情况下,例子#2是正确的行动方案.示例#3也是有效的,如果你有需要在此时执行的清理代码.但是,例如#1 不应该在任何情况下进行,因为这意味着你最后可能会忽略了你的异常不能预测,然后你在程序结束腐败,你永远不会意识到这一点.
| 归档时间: |
|
| 查看次数: |
874 次 |
| 最近记录: |