2

关于 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;
4

1 回答 1

5

虽然它们都与异常处理有关,但它们是不同的野兽。

尝试...最后是资源清理。当您分配在例程结束时被清理的资源时,应该始终使用它。(在这里广义地解释“资源”——你也需要它来处理锁等。)

Try...Except 用于捕获异常。仅当您有合理的处理方式可能发生异常时才使用它。除了作为顶级错误记录工具的一部分之外,您几乎不应该简单地获取所有异常。(我不会说你永远不应该全部捕获——例如,你正在读取一个配置文件,这很糟糕。你唯一真正的选择是中止程序或尖叫,使用默认值并继续。一般用户可能更喜欢后者。)

它们可以嵌套到任何深度(当您分配多个资源时,您要么必须嵌套它们,要么必须有某种方法在放手之前确定是否获得了资源)并自由共存。

于 2012-09-26T03:19:12.077 回答