10

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

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,但我需要有一个事务。

4

1 回答 1

11

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

该文档指出:

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

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

逻辑是:1)您的事务被 throw 中止 2)然后您无法从事务内部恢复 3)因此在事务外部采取最里面的 catch。

这两个例外(双关语)是UpdateConflict并且DuplicateKeyException不会产生 a ttsabort,因此可能会在事务中被捕获。

另请参阅此博客条目,它证明了这一点。

更新:潜在的陷阱

使用全部捕获(未指定异常类型)可能会导致问题。请参阅此博客文章
从 D365O 更新 5 开始,如果 tts 级别大于 1,则 catch all 不会捕获这两个异常。请参阅此博客文章

于 2012-09-23T13:13:42.410 回答