在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
答案 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...except
和try...finally
很难看。它们会分散您的代码所做的事情。更好的方法是将错误处理提取到单独的方法中:
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 ...除了函数之外并处理它们。它没有必要。如果您使用的DB库值得,open
或close
中的异常不会使连接处于未知状态。然后,对于你不期望的事情有例外。
相同的技术可以与任何资源一起使用:对象创建,文件访问等。当保证函数体不会引发异常时try...finally
是不必要的。
当然,还有函数调用开销,但在大多数情况下,它可以忽略不计,并且您的错误处理函数应该足够小,以便让编译器内联它们。