Delphi中的C#/ Java“Try / Finally / Catch”等效构造

时间:2010-11-11 15:19:04

标签: delphi exception-handling

在Delphi中,你如何才能最终使用try,并一起捕捉? 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 个答案:

答案 0 :(得分:18)

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

// initialize / allocate resource (create objects etc.)
...
try
  try
    // use resource
    ...
  except
    // handle exception
    ...
  end;
finally
  // free resource / cleanup
  ...
end

答案 1 :(得分:10)

try 
  // allocate resource here
  try 
  finally
    // free resource here
  end;
except
  // handle exception here
end;

答案 2 :(得分:4)

虽然将try...except嵌套在try...finally内(或反之亦然)直接回答了我想指出的问题,我想指出原始问题,无论您使用何种语言,都会混淆错误处理和资源管理。 Try...excepttry...finally很难看。它们会分散您的代码所做的事情。更好的方法是将错误处理提取到单独的方法中:

procedure Read(Connection: TDBConnection);
begin
  try
    //Read DB
  except
    //Handle Exception
  end;
end;

procedure ReadRecord;
begin
  DBConnection.Open;
  Read(DBConnection);
  DBConnection.Close;
end;

现在您的错误处理是自包含的,可以忽略,因此您可以将注意力集中在快乐路径上。

等待!那么openclose怎么样?如果他们提出异常怎么办?

简单。将这些操作包装在try ...除了函数之外并处理它们。它没有必要。如果您使用的DB库值得,openclose中的异常不会使连接处于未知状态。然后,对于你不期望的事情有例外。

相同的技术可以与任何资源一起使用:对象创建,文件访问等。当保证函数体不会引发异常时try...finally是不必要的。

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