是否有可能捕获内部异常:
try
{
ttsbegin;
info("step one");
try
{
info("step two");
throw Error("error");
}
catch
{
info("catch step two");
}
ttscommit;
}
catch
{
info("catch step one");
ttsabort;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以评论ttsbegin;/ttscommit,但我需要进行交易.
Jan*_*sen 10
不,这是没有可能的(除非你的例外是UpdateConflict
或DuplicateKeyException
).
文件说明:
如果在事务内抛出异常,则事务将自动中止(发生ttsAbort操作).这适用于手动抛出的异常和系统抛出的异常.
当在ttsBegin - ttsCommit事务块中抛出异常时,该事务块中的catch语句不能处理该异常.相反,事务块之外的最里面的catch语句是要测试的第一个catch语句.
逻辑是:1)您的交易被抛出中止2)然后您无法从您的交易内部恢复3)因此在交易之外采取最内层的捕获.
两个例外(双关语)是UpdateConflict
并且DuplicateKeyException
不会产生ttsabort
,因此可能被捕获在交易中.
另请参阅此博客文章,以证明这一点.
使用catch all(未指定任何异常类型)可能会导致问题.看到这篇博文.
从D365O更新5开始,如果tts级别大于1,则两个异常不被catch all捕获.看到这篇博文.
归档时间: |
|
查看次数: |
6053 次 |
最近记录: |