【发布时间】:2014-08-29 20:34:23
【问题描述】:
我有一些 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 在这种情况下中断的行为是“预期的”,因为该异常没有“处理”。
我想澄清一下我的选项是什么,以防止在此代码运行时弹出 mad-except 对话框,无论是否有内部异常被抛出和忽略。
所以我认为没有开关来禁用 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;
如果这三个都是有效的解决方案,我是否应该出于某种原因更喜欢其中一个?
【问题讨论】:
-
我看不出有什么理由不使用它们。这实际上取决于正在执行的代码。如果你需要清理一些东西,最后一个是你的选择。如果不是,那么问问自己是否需要以不同的方式处理特定类型的异常。无论如何,你只是忽略它,所以第一个就是你所需要的。
-
@Jerry:第一个不是必需的,实际上是有害的,因为它可以掩盖未预料到的异常。第二个例子是正确的。
-
@Mason 阅读您的回答后,是的,我知道这将是一个问题。
-
为什么访问越界?你的代码坏了?最好修复它。
-
是的,在一般情况下,最好先进行一些防御性编程并进行明确的边界检查,但这是在紧密循环中的一些性能关键代码中,结果超出了边界/invalid 非常罕见。在一般情况下跳过边界检查并处理在不常见情况下创建异常的代价会更快。