是否有可能捕获内部异常:
try
{
ttsbegin;
info("step one");
try
{
info("step two");
throw Error("error");
}
catch
{
info("catch step two");
}
ttscommit;
}
catch
{
info("catch step one");
ttsabort;
}
我知道我可以评论ttsbegin; / ttscommit,但我需要进行交易。
答案 0 :(得分:10)
不,不可能(除非您的例外是UpdateConflict
或DuplicateKeyException
)。
如果在事务中抛出异常,则事务将自动中止(发生ttsAbort操作)。这适用于手动抛出的异常和系统抛出的异常。
当在ttsBegin - ttsCommit事务块中抛出异常时,该事务块内的catch语句不能处理该异常。相反,事务块之外的最里面的catch语句是要测试的第一个catch语句。
逻辑是:1)您的交易被投掷中止2)然后您无法从交易内部恢复3)因此在交易之外采取最内层的捕获。
两个例外(双关语)是UpdateConflict
和DuplicateKeyException
,它们不会成为ttsabort
,因此可能会在交易中被捕获。
另见this blog entry证明了这一点。
使用catch all(未指定任何异常类型)可能会导致问题。见this blog post。
从D365O更新5开始,如果tts级别大于1,则两个异常不被catch all捕获。见this blog post。