交易:除了或在e:例外?

use*_*050 9 delphi

两者之间究竟有什么区别(以及使用什么):

try
  UniTransaction1.Commit;
except
  UniTransaction1.Rollback;
end;
Run Code Online (Sandbox Code Playgroud)

并且:

try
  UniTransaction1.Commit;
except
  on E:exception do
    UniTransaction1.Rollback;
end;
Run Code Online (Sandbox Code Playgroud)

是不是'除了'一个例外?

Dav*_*nan 11

前者将捕获作为异常引发的所有对象,后者仅捕获从类派生的对象Exception.

它并不是众所周知,但Delphi确实提出了引发非衍生的异常Exception.也就是说,你可以完全自由地使用不是派生的对象引发异常Exception.在实践中,我从未遇到过这样的事情.你根本看不到代码会引发任何不能衍生出来的东西Exception.对于所有意图和目的,这意味着两个变体的行为相同.

由于您没有引用异常对象,因此您似乎没有必要声明一个从未使用过的变量.这带来了另一种选择:

on Exception do
  .... 
Run Code Online (Sandbox Code Playgroud)

这将捕获与第二个变体相同的所有异常,但不会声明可引用异常对象的变量.

你应该使用哪一个?您可以使用它们中的任何一个并具有相同的行为,当然假设您没有遇到不是从中派生的异常Exception.如果是我,我会选择你的第一个选择.它是最简洁的,它只是说你希望这个代码在任何异常的情况下发生.

  • 我明白了,但他的例子吞没了数据库事务而没有通知用户..非常差. (3认同)