例外に関する Eric Lippertの記事を読むことは、プロデューサーとしてもコンシューマとしても、例外にどのように取り組むべきかについて、間違いなく目を見張るものでした。ただし、厄介な例外のスローを回避する方法に関するガイドラインを定義するのにまだ苦労しています。
具体的には:
- a)他の誰かがあなたの前にレコードを変更したか、b)作成しようとしている値が既に存在するため、失敗する可能性のあるSaveメソッドがあるとします。これらの条件は例外ではなく予期されるものであるため、例外をスローする代わりに、メソッドのTryバージョン、TrySaveを作成することにします。TrySaveは、保存が成功したかどうかを示すブール値を返します。しかし、それが失敗した場合、消費者はどのように問題があったのかを知ることができますか?または、結果を示す列挙型、Ok / RecordAlreadyModified / ValueAlreadyExistsなどを返すのが最善でしょうか?integer.TryParseでは、メソッドが失敗する理由は1つしかないため、この問題は存在しません。
- 前の例は本当に厄介な状況ですか?または、この場合に例外をスローするのが好ましい方法でしょうか?Entityフレームワークを含むほとんどのライブラリとフレームワークでそれがどのように行われるかを知っています。
- メソッドのTryバージョンを作成するタイミングと、メソッドが機能するかどうかを事前にテストする方法を提供するタイミングをどのように決定しますか?私は現在これらのガイドラインに従っています:
- 競合状態の可能性がある場合は、Tryバージョンを作成します。これにより、消費者が外因性の例外をキャッチする必要がなくなります。たとえば、前に説明したSaveメソッド。
- 条件をテストするメソッドが元のメソッドが行うことをほぼすべて実行する場合は、Tryバージョンを作成します。たとえば、integer.TryParse()。
- それ以外の場合は、条件をテストするメソッドを作成します。