ホームページ >バックエンド開発 >C++ >「throw」と「throw new Exception()」: C# で例外を再スローする必要があるのはどのような場合ですか?

「throw」と「throw new Exception()」: C# で例外を再スローする必要があるのはどのような場合ですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-13 12:20:53334ブラウズ

`throw` vs. `throw new Exception()`: When Should You Rethrow Exceptions in C#?

C# 例外処理: throwthrow new Exception()

の違い

C# 例外を処理する場合、プログラマは次の 2 つの似た構造に遭遇することがあります。

<code class="language-csharp">try { ... }
catch { throw }</code>

<code class="language-csharp">try { ... }
catch (Exception e) { throw new Exception(e.Message); }</code>

どちらも例外をスローしますが、動作には大きな違いがあります。

throw

パラメーターのない throw ステートメントは、try ブロックの失敗の原因となった元の例外を再スローします。これは、元の例外のスタック トレースが保存され、デバッグやエラーの原因の追跡が容易になることを意味します。

throw new Exception()

一方、throw new Exception(e.Message) は、元の例外のメッセージに設定された Message 属性を持つ新しい例外インスタンスを作成します。ただし、これにはいくつかの欠点があります:

  • スタック トレースが失われました: 新しい例外のスタック トレースがリセットされ、元の例外ソースからのトレース情報がすべて破棄されます。
  • 型情報の損失: 新しい例外は元の例外の型を失ったため、その正確な性質を判断することが困難になっています。
  • 追加情報の損失: ArgumentException などの一部の例外には、異なるタイプの新しい例外を作成するときに失われる追加情報 (ParamName など) が含まれています。

ベストプラクティス:

ほとんどの場合、例外を再スローするために throw e または throw new Exception(e.Message) を使用しないことを強くお勧めします。次の点を考慮してください:

  • 元のスタック トレースを保持する: 元の例外を再スローしてそのスタック トレースを保持するには、throw; を使用します。
  • ラップされた例外: 場合によっては、追加情報を提供するためにすべての例外をカスタム例外オブジェクトでラップする必要がある場合があります。ただし、カスタム例外には 4 つの例外コンストラクターがすべて含まれており、スタック トレースを含む元の例外のプロパティを InnerException 引数として渡すことによって保持していることを常に確認してください。

以上が「throw」と「throw new Exception()」: C# で例外を再スローする必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。