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

いいえ、できませUpdateConflictん(例外がまたはでない限りDuplicateKeyException)。

ドキュメントには次のように記載されています。

トランザクション内で例外がスローされた場合、トランザクションは自動的に中止されます(ttsAbort操作が発生します)。これは、手動でスローされた例外とシステムによってスローされた例外の両方に適用されます。

ttsBegin --ttsCommitトランザクションブロック内で例外がスローされた場合、そのトランザクションブロック内のcatchステートメントは例外を処理できません。代わりに、トランザクションブロックの外側にある最も内側のcatchステートメントが、テストされる最初のcatchステートメントです。

ロジックは次のとおりです。1)トランザクションがスローによって中止されます。2)トランザクション内のトランザクションから回復することはできません。3)したがって、トランザクションの外側で最も内側のキャッチを取得します。

2つの例外(しゃれを意図したもの)はUpdateConflictDuplicateKeyExceptionaを作成しないためttsabort、トランザクション内でキャッチされる可能性があります。

それを示すこのブログエントリも参照してください。

更新:潜在的な落とし穴

catch all(例外タイプが指定されていない)を使用すると、問題が発生する可能性があります。このブログ投稿を参照してください。
D365Oアップデート5の時点では、ttsレベルが1より大きい場合、2つの例外はキャッチオールによってキャッチされません。このブログ投稿を参照してください。

于 2012-09-23T13:13:42.410 に答える