如何捕获内部异常?

dem*_*mas 9 x++ axapta

是否有可能捕获内部异常:

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

不,这是没有可能的(除非你的例外是UpdateConflictDuplicateKeyException).

文件说明:

如果在事务内抛出异常,则事务将自动中止(发生ttsAbort操作).这适用于手动抛出的异常和系统抛出的异常.

当在ttsBegin - ttsCommit事务块中抛出异常时,该事务块中的catch语句不能处理该异常.相反,事务块之外的最里面的catch语句是要测试的第一个catch语句.

逻辑是:1)您的交易被抛出中止2)然后您无法从您的交易内部恢复3)因此在交易之外采取最内层的捕获.

两个例外(双关语)是UpdateConflict并且DuplicateKeyException不会产生ttsabort,因此可能被捕获在交易中.

另请参阅此博客文章,以证明这一点.

更新:潜在的陷阱

使用catch all(未指定任何异常类型)可能会导致问题.看到这篇博文.
从D365O更新5开始,如果tts级别大于1,则两个异常不被catch all捕获.看到这篇博文.