MadExcept + try/finally阻止?

Jes*_*own 3 delphi madexcept

我有一些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)

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

Mas*_*ler 5

所以我认为没有开关禁止MadExcept打破try/finally块中的无法处理的异常?

是. try/finally不是异常处理 ; 无论是否发生异常,都可以保证清理.因此,try/finally块与MadExcept等异常处理工具完全无关.

即使我想忽略它,我还是需要明确地"捕获"异常?

是.这就是异常的工作方式.它们沿着堆栈向下工作,直到找到捕获它们的处理程序.如果不存在这样的处理程序,则操作系统将其解释为崩溃并终止程序.Delphi的TApplication对象安装了一个处理器非常接近调用堆栈的底部,这样你的程序将不会崩溃,并MadExcept挂钩这一点,以便如果有异常了这一点,就会生成报告.

如果你想忽略一个例外,是的,你需要抓住它,因为你在做什么是正式"的使用在这点在堆栈展开追赶它,忽略它处理异常." 关于"在堆栈展开时捕获它"的那一部分很重要,因为它意味着堆栈展开在该点停止并且程序恢复正常执行.如果你只是忽略它,(即在你的代码中没有做任何事情,包括不安装异常处理程序),它将继续将堆栈一直展开到默认处理程序,无论你是否安装了MadExcept.

所以是的,在这种情况下,例子#2是正确的行动方案.示例#3也是有效的,如果你有需要在此时执行的清理代码.但是,例如#1 不应该在任何情况下进行,因为这意味着你最后可能会忽略了你的异常不能预测,然后你在程序结束腐败,你永远不会意识到这一点.

  • @Remy关键是要正确执行流程.madExcept无关紧要.处理异常与否,会改变程序的行为.更改执行的代码.一个人必须做到这一点.如果这意味着madExcept看到一个不应该创建错误报告的未处理异常,则需要在ME未处理的异常处理程序中处理.在较低级别处理异常是改变ME处理它的方式的错误方法. (2认同)