2

たとえば、null参照をチェックする必要がある車を使用するサブに車を渡す場合はどうなりますか?

このコードを以下のifステートメントでラップする必要がありますか?かなり冗長に思えますが、例外をキャッチして処理することができないため、より良い例を示すことができたはずです。

それとも、例外を発信者にバブルさせる必要がありますか?

例えば:

Public Sub CarService(ByVal car As ICar)
    If car IsNot Nothing Then
        'do logic here 
    Else : Throw New ArgumentNullException
    End If
End Sub
4

5 に答える 5

4

自分自身を投げることNullReferenceExceptionは実際には無意味です。このままでは

  1. CLR が発生させるのと同じ例外 (少なくとも、手動でチェックする同じ参照にアクセスする場合null) および
  2. とにかくがっかりです。ここの備考を参照 してください。関連する議論については、拡張メソッドから NullReferenceException をスローする必要がありますか? を参照してください。.

ただし、少なくともパブリック API サーフェスについては、null 参照をチェックして、ArgumentNullException.

Public Sub CarService(ByVal car As ICar)
    If car Is Nothing Then
        Throw New ArgumentNullException("car")
    End If
    ' do logic here
End Sub

またはCode Contractsを調べてください。

于 2012-11-09T07:48:08.507 に答える
1

シチュエーションにもよると思います。nullがメソッドに渡す有効な値である場合があります。そうでない場合は、コードがオブジェクトに到達する前に発生するロジックの量を比較検討する必要がありnullます。その時点までに重要なことが何も起こらない場合は、単にバブルアップさせることができます. そのオブジェクトを使用する前に重要な操作を行う場合は、メソッドに入るときにそれを確認する価値があります。また、複数のオブジェクトがある場合、呼び出し元はどのオブジェクトが問題を引き起こしたのかわからないため、適切なエラー メッセージを追加して、自分で例外をスローする可能性があります。

于 2012-11-09T07:49:07.007 に答える
1

それはあなた次第です。

NULLs がロジックの一部である場合は、メソッド内で処理しますCarService。たとえば、あなたのコードでは、NULL車は未知の車を意味するかもしれません。その場合、その車のロジックを書く必要があります。

を渡すことになっていない場合は、例外をスローする必要がありますNULLそうすれば、エッジケースは呼び出し側で処理されます。たとえば、コードが次のようなことをするとします。

Public Sub CarService(ByVal car As ICar)
    car.ToString();
End Sub

このような場合、明示的にエラーをスローすることは意味があり、フレームワーク全体で一貫しています。

于 2012-11-09T07:49:39.357 に答える
1

私の意見では、自分で NullReferenceException をスローするのはナンセンスです (CLR が代わりに行います)。しかし一方で、ArgumentNullException をスローすることは、私にとって良い習慣です。エラーが発生した場合、問題がどこにあり、どのパラメーターが null にならないかを正確に知ることができます。このような繰り返されるコードを書く時間を節約するために、ReSharper でマクロを使用します (問題なく 2 秒以内に収まります)。

于 2012-11-09T08:02:45.440 に答える
1

コードが予測不可能になるのを防ぐので、それは良い考えだと思います。例外は次のコードに依存するため、それによって変更される可能性があります。コードを使用すると、どこでどの例外をスローできるかがわかります。

考慮すべき唯一のことは、どの例外を使用するか、独自の例外を作成するかです。NullReference は少し見当違いのようです。

于 2012-11-09T07:48:08.570 に答える