delphi – MadExcept try / finally块?
我有一些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; 如果所有这三个都是有效的解决方案,我是否应该出于任何原因而优先选择其中一个? 解决方法
是. try / finally不是异常处理;无论是否发生异常,都可以保证清理.因此,try / finally块与诸如MadExcept之类的异常处理工具完全无关.
是.这就是异常的工作方式.它们沿着堆栈向下工作,直到找到捕获它们的处理程序.如果不存在这样的处理程序,则操作系统将其解释为崩溃并终止程序. Delphi的TApplication对象安装一个非常靠近调用堆栈底部的处理程序,这样你的程序就不会崩溃,而MadExcept会挂钩它,这样如果异常到达这一点,就会生成一个报告. 如果你想忽略一个异常,是的,你确实需要捕获它,因为你正在做的是正式“通过在堆栈的这一点上捕获异常并忽略它来处理异常”.关于“在堆栈展开时捕获它”的那一部分很重要,因为它意味着堆栈展开在该点停止并且程序恢复正常执行.如果你只是忽略它,(即在你的代码中没有做任何事情,包括不安装异常处理程序),它将继续将堆栈一直展开到默认处理程序,无论你是否安装了MadExcept. 所以是的,在这种情况下,例子#2是正确的行动方案.示例#3也是有效的,如果你有需要在此时执行的清理代码.但是示例#1永远不应该在任何情况下完成,因为这意味着你最终可能会忽略一个你没有预料到的异常,然后你最终会在你的程序中出现腐败而你永远不会意识到它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |