Maw*_*awg 2 delphi exception-handling try-finally try-except
关于Delphi中异常处理的两个非常基本的问题.
1)什么时候Try?我的猜测是我不需要一个Try条款
但我确实需要 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;
Run Code Online (Sandbox Code Playgroud)
问题:是否只是去捕捉异常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;
Run Code Online (Sandbox Code Playgroud)
虽然它们都属于异常处理,但它们是不同的野兽.
尝试...最后是资源清理.当您分配在例程结束时清理的资源时,应始终使用它.(解释"资源"广泛在这里 - 你需要的东西像锁等也.)
尝试...除了捕获异常.只有当您有合理的处理方式可能发生异常时才使用它.你应该几乎从不简单地抓取不是作为一个顶级错误日志记录功能的一部分,其他所有异常.(我不会说你不应该捕获所有的 - 比如,你正在读一个配置文件,它是坏你的唯一真正的选择是退出程序或发牢骚,使用默认值,并继续在一般的用户可能会喜欢的.后者.)
它们可以嵌套到任何深度(当你分配多个资源时,你必须嵌套它们,或者你必须有一些方法来确定是否获得资源,然后再放弃它)并自由共存.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |