代码之家  ›  专栏  ›  技术社区  ›  ashes999

在delphi中的“尝试/最后捕获”等价结构

  •  15
  • ashes999  · 技术社区  · 15 年前

    在Delphi中,如何使用Try、Finally和Catch?一个Java/C等价物看起来像:

    try {
        // Open DB connection, start transaction
    } catch (Exception e) {
        // Roll back DB transaction
    } finally {
        // Close DB connection, commit transaction
    }
    

    如果您在Delphi中尝试这个方法,您可以使用Try/Finally或Try/Except;但不能同时使用这三种方法。我想要如下代码(不编译):

    try
        // Open DB connection, start transaction
    except on e: Exception do
    begin
        // Roll back transaction
    end
    finally // Compiler error: expected "END" not "finally"
    begin
        // Commit transaction
    end
    
    3 回复  |  直到 14 年前
        1
  •  18
  •   mjn anonym    15 年前

    在Delphi中,您可以使用以下模式:

    // initialize / allocate resource (create objects etc.)
    ...
    try
      try
        // use resource
        ...
      except
        // handle exception
        ...
      end;
    finally
      // free resource / cleanup
      ...
    end
    
        2
  •  10
  •   Eugene Mayevski 'Callback    15 年前

    try 
      // allocate resource here
      try 
      finally
        // free resource here
      end;
    except
      // handle exception here
    end;
    
        3
  •  4
  •   Kenneth Cochran    15 年前

    当嵌套 try...except A内 try...finally (或者反之亦然)直接回答我想指出的问题,无论您使用什么语言,原始问题都混合了错误处理和资源管理的关注点。 Try...except 尝试…最后 很难看。它们会分散你对代码的注意力。更好的方法是将错误处理提取到单独的方法中:

    procedure Read(Connection: TDBConnection);
    begin
      try
        //Read DB
      except
        //Handle Exception
      end;
    end;
    
    procedure ReadRecord;
    begin
      DBConnection.Open;
      Read(DBConnection);
      DBConnection.Close;
    end;
    

    现在,您的错误处理是独立的,可以忽略,因此您可以将注意力集中在 快乐的道路 .

    等待!那么 open close ?如果他们提出例外怎么办?

    简单。在try…中包装这些操作,除了函数并处理它们。这不应该是必要的。如果您使用的数据库库值得在 打开 关闭 不会使连接处于未知状态。再说一次,你不期望的事情也有例外。

    同样的技术可以用于任何资源:对象创建、文件访问等。当保证函数体不会引发异常时 尝试…最后 是不必要的。

    当然,函数调用开销是存在的,但在大多数情况下,它是可以忽略的,并且您的错误处理函数应该足够小,以允许编译器内联它们。