例外を定義し、スローし、キャッチする場所についてどう思いますか。また、考慮事項についてコンセンサスがあるかどうかを確認したいと思います。
基礎となる例を述べさせてください。私には解決策があり、その解決策には2つのプロジェクトがあるとしましょう:DomainProject
とControllerProject
。
DomainProjectには、クエリを実行するためのリポジトリがあります。たとえば、
RepositoryClass
次のメソッドがあります。GetObjectById(int id) { ... }
そして、私はこのプロジェクトでのようないくつかの例外を定義しています
ObjectNotFoundException
。リポジトリにクエリを実行し
ControllerProject
たいので、次のようになります。MyObject obj = repo.GetObjectById(11);
ここで問題となるのは、IDが実際に存在するかどうかを誰がチェックする必要があるかです。ControllerProjectがIDの存在をチェックすることを選択した場合、次のようなコードになってしまう可能性があります。
MyObject obj = repo.GetObjectById(11);
if (obj == null) {throw new ObjectNotFoundException();}
しかし、その欠点は、使用される場所全体で重複する傾向があることGetObjectById
です。もちろん、null値を取得してもかまわない状況もあるため、DomainProjectで例外を直接スローしないのはどういうわけか正当なことです。しかし、最初にifテストを複製するのは好きではありません。次に、私の質問に関連して、現在のプロジェクトの外部で例外定義を使用するのは好きではありません。
例外は、それが定義されているプロジェクトでのみスローされるべきであり、他のプロジェクトはそれらをキャッチするだけである必要があると私は感じています。
さて、私の例に戻ると、この状況をどのように解決すればよいでしょうか。簡単なアイデアは、私のドメインプロジェクトで2つのメソッドを定義することです。例外をスローするものとスローしないもの。私が確信していない唯一のことは、私が使用しなければならない命名規則です:GetObjectByIdThrowsIfNotFound()
とGetObjectById()
。または、オプションのパラメータを追加することもできますGetObjectById(int id, bool isExceptionThrow = true)
。
例外についてどう思いますか?
ありがとう