当前位置 : 主页 > 编程语言 > delphi >

delphi – MadExcept try / finally块?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我有一些delphi代码,有点像这样: try //some code //occasionally throws an exception here, for example an EIndexOutOfRangeException //more code...should get skipped if exception is thrownfinally // there may or may not be any impo
我有一些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;

如果所有这三个都是有效的解决方案,我是否应该出于任何原因而优先选择其中一个?

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永远不应该在任何情况下完成,因为这意味着你最终可能会忽略一个你没有预料到的异常,然后你最终会在你的程序中出现腐败而你永远不会意识到它.

网友评论