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

Maw*_*awg 2 delphi exception-handling try-finally try-except

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

Lor*_*tel 5

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

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

尝试...除了捕获异常.只有当您有合理的处理方式可能发生异常时才使用它.你应该几乎从不简单地抓取不是作为一个顶级错误日志记录功能的一部分,其他所有异常.(我不会说你不应该捕获所有的 - 比如,你正在读一个配置文件,它是坏你的唯一真正的选择是退出程序或发牢骚,使用默认值,并继续在一般的用户可能会喜欢的.后者.)

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

  • @Mawg:你倒退了.你只把try ...除了可以合理处理异常的东西之外的块.如果您无法计划出特定的异常以及您想要做什么,那么除了用于记录目的之外,您不应该捕获它.如果出现问题,你没想到你可能不应该继续运行程序 - 那就是要求数据损坏. (3认同)
  • 如果你决定按照早期评论者的建议:(1)只在你可以正确处理异常的地方使用try/except,(2)使用try/finally来清理资源,那么我建议你看看Alister Christie不错关于构造函数/析构函数中的异常的电影[http://codegearguru.com/video/030/TSuicide.html]以及如何处理它们.他只使用try/finally块并将异常处理留给应用程序他解释了你拥有的不同选项,并将其扩展为创建多个对象. (2认同)