如何捕获内部异常?

时间:2012-09-21 18:16:39

标签: axapta x++

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

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,但我需要进行交易。

1 个答案:

答案 0 :(得分:10)

不,可能(除非您的例外是UpdateConflictDuplicateKeyException)。

The documentation州:

  

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

     

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

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

两个例外(双关语)是UpdateConflictDuplicateKeyException,它们不会成为ttsabort,因此可能会在交易中被捕获。

另见this blog entry证明了这一点。

更新:潜在的陷阱

使用catch all(未指定任何异常类型)可能会导致问题。见this blog post
从D365O更新5开始,如果tts级别大于1,则两个异常不被catch all捕获。见this blog post