1. ホーム
  2. c#

[解決済み] ベストプラクティス: プロパティから例外を投げる

2022-09-12 14:48:54

質問

プロパティゲッターまたはセッターの内部から例外をスローすることが適切なのはどのような場合でしょうか。いつ適切ではありませんか。なぜですか? このテーマに関する外部ドキュメントへのリンクがあると助かります。Googleで調べても意外と出てきません。

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

Microsoft は、プロパティをどのように設計するかについて、次のサイトで推奨しています。 http://msdn.microsoft.com/en-us/library/ms229006.aspx

基本的に、彼らはプロパティゲッターを、常に安全に呼び出せる軽量なアクセサにすることを推奨しています。例外をスローする必要がある場合は、ゲッターをメソッドとして再設計することを勧めています。セッターについては、例外が適切かつ許容可能なエラー処理方法であることを示唆しています。

インデクサについては、マイクロソフトは、ゲッターとセッターの両方が例外を投げることは容認できると示しています。そして、実際、.NET ライブラリの多くのインデクサーはこれを行います。最も一般的な例外は ArgumentOutOfRangeException .

プロパティゲッターで例外を投げたくないのには、かなり良い理由があります。

  • プロパティはフィールドであるように見えるので、(設計上)例外を投げることができるとは必ずしも明らかではありません。一方、メソッドでは、プログラマは例外がメソッドを呼び出した結果として予想されるものかどうかを予想し調査するように訓練されています。
  • ゲッターはシリアライザーやデータバインディング (たとえば WinForms や WPF) など、多くの .NET インフラストラクチャで使用されます。このようなコンテキストで例外を処理すると、急速に問題になることがあります。
  • プロパティ ゲッターは、オブジェクトを監視または検査するときに、デバッガーによって自動的に評価されます。ここで例外が発生すると、混乱し、デバッグ作業が遅くなる可能性があります。また、同じ理由で、プロパティで他の高価な操作 (データベースへのアクセスなど) を実行することも望ましくありません。
  • プロパティはしばしば連鎖的に使用されます。 obj.PropA.AnotherProp.YetAnother - このような構文では、例外のキャッチ・ステートメントをどこに挿入するかを決定するのが問題になります。

余談ですが、注意しなければならないのは、プロパティが 設計されていない が例外を発生させるように設計されていないからといって、発生させないということではありません。文字列のような)新しいオブジェクトを割り当てるという単純な行為でさえ、例外を発生させる可能性があります。常に防御的にコードを書き、呼び出すものから例外が発生することを予期しておく必要があります。