5

私はデータアクセス層にいくつかの機能を持っています

public Order RetrieveById(int id)
public List<Order> RetrieveByStatus(OrderStatus status)

今、私は例外の発生について少し混乱しています。

RetrieveById 関数の場合、1 未満の id は無効な id であるため、例外を発生させたいと思います。そして、データベースに存在しないIDに対してnullを返すような気がします。それから、私は複雑になりすぎているように感じます。

RetrieveByStatus の場合、そのステータスのデータがデータベースにない場合は空のリストを返すような気がします。

ただし、RetrieveById が何も返せないときに例外を発生させる人もいることを見てきましたが、RetrieveByStatus はレコードがない場合に例外を発生させるべきではありませんか?

誰かが私のためにこれらの概念を明確にしてもらえますか?

4

4 に答える 4

3
  1. 最初にMSDNをお読みください:例外の作成とスロー(C#プログラミングガイド)。例外をスローすることが予想される場合と、それを回避する場合の両方の状況がリストされています。
  2. また、C#でのtry / catchの実際のオーバーヘッドは何ですか?

いずれの場合も、nullリターンまたはスローされた例外のいずれかを処理する必要があります


私自身は、どちらの方法でも、明示的に例外をスローしない方がいいと思います。メソッドがnullを返しても、idでオブジェクトを見つけられなかったとしても、悪いことは何もありません。一方、RetrieveByStatusメソッドはnullではなく空のコレクションを返す可能性があります。

さらに、LINQで使用されるパターンに従うことができます。たとえば、Enumerable.FirstメソッドとEnumerable.FirstOrDefaultメソッド(例外をスローするかnullを返す)があるため、特定の状況で、idが100の場合に適切なパターンを使用できます。 %有効、または逆に欠落している可能性がある場合。要素のシーケンスを返すメソッドは、返すシーケンスが空であるように見える場合でも例外をスローしません。Enumerable.Whereを検討してください。

于 2012-10-26T04:26:40.020 に答える
3

最初のケースでは、null を返す代わりに、例外を処理して自分自身を処理する可能性があります。最初のメソッドが、返されたオブジェクトが Order 参照に保存されるように使用されている場合はどうでしょう。 NullReferenceExceptionスローされる可能性が非常に高くなります。 、誰かがそのオブジェクトのメソッドまたはプロパティを呼び出そうとしたとき。

2番目の方法では、一部の人が示唆しているように、空のリストを使用します。

于 2012-10-26T04:34:44.540 に答える
3

null私は最初のケースと2 番目のケースで戻りたいと思いempty list ます。

しかし、例外を発生させたい場合は、例外を発生させることができます。これは、最初のメソッドを呼び出すことは、それが存在する必要があることを知っていることを意味するため、無効public Order RetrieveById(int id)であることを意味するためです。idid

2 番目のケースでは、OrderStatus有効である可能性があり、それに対してレコードが見つからないため、空のリストを返すことをお勧めします。

于 2012-10-26T04:15:30.957 に答える
-1

NullRefExceptions特定の例外よりもはるかに不可解なため、可能な限り null を返すことは避けたいと思いますOrderNotFoundException。また、エンティティが常に null であることを期待しなければならない場合、コードはかなり鈍くなります。とにかく、これは例外的なケースであるはずです-データベースに存在しない場合、そのIDはどこで取得しましたか?

これがエラーをスローする可能性が高いと思われる場合は、DoesObjectExistorTryGet型メソッド (または拡張メソッド) を追加できます。

于 2012-10-26T04:59:19.940 に答える