关于Delphi中异常处理的两个非常基本的问题。
1)什么时候到Try
?我的猜测是我不需要围绕
Try
条款
但我确实需要Try
我错过了什么吗?
2)尝试......最后还是尝试......除了......或两者兼而有之? 多年来我一直认为这是一个或者两个选择,直到@RRUZ用一些代码回答one of my questions
try
CoInitialize(nil);
try
SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
问题:除了仅从CoInitialize(nil);
或从SetStaticIpAddress('Network card name','192.168.1.1','255.255.255.0');
捕获例外情况之外是什么?
换句话说,是否有可能通过尝试最后尝试一下我的蛋糕并吃掉它?
[更新]#2的答案似乎是肯定的。此代码显示两个对话框...
procedure TForm3.FormCreate(Sender: TObject);
var x, zero : Integer;
begin
zero := 0;
try
try
x := 42 div zero;
finally
MessageDlg('Divide by zero finally', mtInformation, [mbOK], 0);
end;
Except
on E: Exception do
MessageDlg('Divide by zero exception handled', mtInformation, [mbOK], 0);
end;
end;
答案 0 :(得分:5)
虽然它们都属于异常处理,但它们是不同的野兽。
尝试......最后是资源清理。当您分配在例程结束时清理的资源时,应始终使用它。 (在这里广泛地解释“资源” - 你也需要它来锁等等。)
尝试...除了用于捕获异常。只有当您有合理的处理方式可能发生异常时才使用它。除了作为顶级错误日志记录工具的一部分之外,您几乎不应该简单地获取所有异常。 (我不会说你永远不应该抓住所有 - 例如,你正在阅读一个配置文件而且它很糟糕。你唯一真正的选择是中止程序或发出声音,使用默认值并继续。通常用户可能更喜欢后者。)
它们可以嵌套到任何深度(当你分配多个资源时,你必须嵌套它们,或者你必须有一些方法来确定是否获得资源,然后再放弃它)并自由共存。 / p>