1. ホーム
  2. c#

[解決済み] C#で例外を再スローする適切な方法は何ですか?[重複しています]。

2022-03-19 03:08:25

質問

したほうがいいのでしょうか。

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw;
}

あるいは、こうだ。

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw ex;
}

両者は同じことをするのか?一方は他方より優れているのか?

どのように解決するのですか?

例外の再投与には、常に次の構文を使用する必要があります。さもないと、スタックトレースを踏みつぶすことになります。

throw;

の結果のトレースを表示すると throw ex この例外の本当の原因ではなく、このステートメントで終わっていることがわかると思います。

基本的には、犯罪行為とみなすべきです。 throw ex .


他の場所(AggregateException、TargetInvocationException)や他のスレッドから来た例外を再スローする必要がある場合、それを直接再スローするべきではありません。むしろ ExceptionDispatchInfo で、必要な情報はすべて保存されます。

try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // just to inform the compiler that the flow never leaves the block
}