[解決済み] ベストプラクティス: プロパティから例外を投げる
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
- このような構文では、例外のキャッチ・ステートメントをどこに挿入するかを決定するのが問題になります。
余談ですが、注意しなければならないのは、プロパティが 設計されていない が例外を発生させるように設計されていないからといって、発生させないということではありません。文字列のような)新しいオブジェクトを割り当てるという単純な行為でさえ、例外を発生させる可能性があります。常に防御的にコードを書き、呼び出すものから例外が発生することを予期しておく必要があります。
関連
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み】コンストラクターからの例外のスローイング
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。