什么时候应该使用“try”块,我应该使用哪种块?

时间:2012-09-26 02:50:39

标签: delphi exception-handling try-finally try-except

关于Delphi中异常处理的两个非常基本的问题。

1)什么时候到Try?我的猜测是我不需要围绕

Try条款
  • 直截了当的代码,例如赋值,条件和循环
  • 访问我的VCL组件

但我确实需要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;

1 个答案:

答案 0 :(得分:5)

虽然它们都属于异常处理,但它们是不同的野兽。

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

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

它们可以嵌套到任何深度(当你分配多个资源时,你必须嵌套它们,或者你必须有一些方法来确定是否获得资源,然后再放弃它)并自由共存。 / p>