2016-08-03 8 views
0

例外がcatchブロックの後でも利用可能な状況に遭遇したようです。私が遭遇する状況では100%再現可能ですが、このシナリオを正確に再現するテストはできません。捕獲された後でスタックに例外が残っています

デバッグ状況のため、この画像を参照してください:次のように

状況は次のとおりです。

  1. 非同期タスクが待っ実行されます。
  2. タスクがフォールト状態に設定されており、例外がスローされます。
  3. コードは、例外ブロックを処理するキャッチブロックを通過します。 < - 期待どおり
  4. 例外は、キャッチブロックの終了後にスタックからクリアされません。 < - 期待通りではない

最終結果:catchブロックの後に続くすべてのコードでMarshall.GetExceptionCode()!= 0。

ここで何が起こっているのか誰でも考えられますか?

+0

デバッグモードになっている場合は例外が表示されます.. – BugFinder

+0

あなたが記述しているのは内部的には未定義の動作であり、仕様によって定義されている保証はありません。あなたは実際にあなたが解決する必要がある特定の問題を抱えていますか? – Luaan

+0

これは、C#コンパイラがasync/awaitを使用するメソッドを書き換える*方法の副作用です。デバッガのコンテキストは、オリジナルのものではなく、書き直されたメソッドです。生成されたコードをildasm.exeで見て、この書き換えロジックの詳細を調べてください。 –

答えて

2

スタックはあなたのものではなく、ランタイムに属します。 .NETコードは、スタックの正確な処理方法に依存するべきではありません。

Marshal.GetExceptionCodeは、相互運用性とコンパイラのサポートにのみ使用されています。.NETコードの2つの(一見無害な)行間で何が起こったかわからないため、実際には.NETユーザーコードでは使用しないでください。

仕様に固執し、定義されていない動作に頼らないでください。膨大な量の未定義の動作が.NETにはないようです。

関連する問題