2015-07-22 8 views
6

Wenn ich den Parameter einer Methode überprüfe, werfe ich einen ArgumentNullException, wenn es null ist. Sehen Sie sich die erste Zeile in der folgenden Methode an. Aber was ist mit Eigenschaften für den Parameter, der nicht null sein sollte? Wenn ich versuche, ihnen die gleiche Art und Weise zu handhaben, erhalte ich einen Code-Analyse-Fehler:Der beste Weg, um Null-Eigenschaften in einem Methodenparameter zu behandeln

CA2208 Instantiate argument exceptions correctly Method 'PriorityDeratingComponentLogic.CreateItem(IvSimulation)' passes 'ivSimulation.SolarPanel' as the 'paramName' argument to a 'ArgumentNullException' constructor. Replace this argument with one of the method's parameter names. Note that the provided parameter name should have the exact casing as declared on the method.

public DeratingComponentBase CreateItem(IvSimulation ivSimulation) 
{ 
    if (ivSimulation == null) { throw new ArgumentNullException("ivSimulation"); } 
    if (ivSimulation.SolarPanel == null) { throw new ArgumentNullException("ivSimulation.SolarPanel"); } 
    if (ivSimulation.GlobalEquipment == null) { throw new ArgumentNullException("ivSimulation.GlobalEquipment"); } 

    // ... method body here 
} 

Sind CA Fehler etwas, das ich unterdrücken soll, oder gibt es eine allgemein akzeptierte Art und Weise, um besser damit zu umgehen? Vielleicht ist das Problem stromaufwärts, und wir sollten nicht einmal nach diesen Eigenschaften suchen müssen, die zu diesem Zeitpunkt null sind.

+1

Ja, diese Codeanalyse Fehlermeldung sieht dumm aus. Das sieht für mich vollkommen in Ordnung aus. Sachen wie dieses ist, warum ich Codeanalyse-Software nie benutzt habe, bevor ... – Jashaszun

+2

'IvSimulation' sollte Konstruktion der ungültigen Werte verhindern, also sollte es' SolarPanel' und 'GlobalEquipment' validieren. – Lee

Antwort

5

Das Werfen eines ArgumentNullException soll anzeigen, dass das Argument selbst null ist. Wenn man jedoch der Argumentation Komponenten ist null, aber das Argument selbst nicht, die richtige Ausnahme ist ArgumentException mit dem Namen des Arguments als Parameter:

if (ivSimulation.GlobalEquipment == null) { 
    throw new ArgumentException("GlobalEquipment cannot be null", "ivSimulation"); 
} 

Dadurch wird die Information über den Fehler in der Nachricht liefert, unter Angabe von ivSimulation als Parametername.

Hinweis: Ich gehe davon aus, dass Sie keine Wahl haben, GlobalEquipment im Konstruktor von IvSimulation Validierung, weil ArgumentNullException werfen eine absolut gültige Wahl in diesem Konstruktor sein würde.

+1

Sie könnten etwas tun: 'werfen neue ArgumentException (" Globale Ausrüstung kann nicht null sein "," ivSimulation ");', um weitere Informationen zu geben. –

+0

@EricHotinger Das ist in der Tat eine bessere Wahl, vielen Dank! – dasblinkenlight

+0

Ich würde eine ** NullReferenceException ** bevorzugen ("Die Ausnahme, die ausgelöst wird, wenn versucht wird, eine Null-Objektreferenz zu dereferenzieren.") Anstelle einer ArgumentException ("Die Ausnahme, die ausgelöst wird, wenn eines der Argumente bereitgestellt wird eine Methode ist nicht gültig. ") weil das Argument selbst gültig ist, aber es ist null. – khlr

1

Es kann argumentiert werden, dass eine Null-Eigenschaft auf einer Nicht-Null-Parameter-Variable nicht wirklich ein Null-Argument ist, so dass die in diesem Fall eigentlich nicht geeignet ist. (Natürlich können andere widersprechen, was in Ordnung ist.) Das fühlt sich für mich wie eine qualitativ andere Situation an. Das Argument fehlt nicht, befindet sich jedoch in einem ungültigen Zustand. Ich denke, ich würde eine InvalidOperationException für Fälle wie diese verwenden, wo ein Objekt in einem ungültigen Zustand ist.

Verwandte Themen