之间的区别(以及使用内容)究竟是什么:
try
UniTransaction1.Commit;
except
UniTransaction1.Rollback;
end;
和:
try
UniTransaction1.Commit;
except
on E:exception do
UniTransaction1.Rollback;
end;
不是'除了'一个例外吗?
答案 0 :(得分:11)
前者将捕获作为异常引发的所有对象,后者仅捕获从类Exception
派生的对象。
它并不是很有名,但Delphi确实提出了引发不是Exception
的异常。也就是说,你可以自由地使用一个不是从Exception
派生的对象来引发异常。在实践中,我从未遇到过这样的事情。您根本就没有看到代码提出任何不是Exception
的代码。对于所有意图和目的,这意味着两个变体的行为相同。
由于您没有引用异常对象,因此您似乎没有必要声明一个从未使用过的变量。这带来了另一种选择:
on Exception do
....
这将捕获与第二个变体相同的所有异常,但不声明可引用异常对象的变量。
你应该使用哪一个?您可以使用它们中的任何一个并具有相同的行为,当然假设您没有遇到不是从Exception
派生的异常。如果是我,我会选择你的第一个选择。它是最简洁的,它只是说你希望这个代码在任何异常的情况下发生。
答案 1 :(得分:0)
第二个选项允许您使用Exception对象添加行为,例如记录异常,显示有关异常原因的详细信息等。
在您的情况下,您正在回滚数据库事务,如果您没有向您的用户提供您正在这样做的任何信息,他/她可能会认为该事务已成功完成。在这种情况下,我会做类似的事情:
try
UniTransaction1.Commit;
except
on E:exception do
begin
UniTransaction1.Rollback;
Raise;
end;
end;