7

これを行うと、スタックトレースが保持されないため、不適切な形式になります。

try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
    throw e; // ...Use "throw;" by itself instead
}

ただし、例外がUI以外のスレッドでキャッチされた場合は、UIに戻して処理し、ユーザーが次のようなメッセージを受け取るようにします。

try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
    Dispatcher.Invoke((Action)(() => { throw; }));
}

ただし、C#レクサーは(正しく) throwステートメントがcatchの内部にあるとは見なさないため、ここではthrowキーワードを単独で使用することはできません。私は代わりにやらなければなりません:

try { /*... some code that can throw an exception ...*/ }
catch (Exception e)
{
    Dispatcher.Invoke((Action)(() => { throw e; }));
}

例外を再スローすると、スタックトレースが失われます。

これを回避する(簡単な)方法はありますか(例外がスレッドを切り替える準備ができたときにスタックトレースをいつでもパッケージ化できますが、それは厄介なようです)?

注:このスレッドを見ましたが、タイトルのみが類似しており、内容は類似していません。

4

1 に答える 1

4

これを行う通常の方法は、元の例外をとして含めて、新しい例外をスローすることInnerExceptionです。このための特別なコンストラクタがありExceptionます。

ただし、本当にこれを実行したい場合で、.Net 4.5を使用している場合は、を使用ExceptionDispatchInfoして、例外のスタックトレースをキャプチャし、スタックトレースをリセットせずに別の場所に再スローできます。ただし、ほとんどの場合、例外を新しいものにラップする古い方法を使用する方がおそらく優れています。

于 2013-02-01T20:00:48.307 に答える