关于 Delphi 中异常处理的两个非常基本的问题。
1) 什么时候Try
?我的猜测是我不需要一个Try
子句
- 简单的代码,例如赋值、条件和循环
- 访问我的 VCL 组件
但我确实需要Try
- 数据库访问
- 任何第三方组件,因为我不知道它们是否会引发异常
- 帮助系统显示的任何内容都可能引发异常
我错过了什么吗?
2)尝试...最后还是尝试...除了...或两者兼而有之?多年来,我一直认为这是一个非此即彼的选择,直到@RRUZ用一些代码 回答了我的一个问题
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;