2015-07-22 16 views
6

Quando si verifica il parametro di un metodo, io lancio un ArgumentNullException se è nullo. Vedi la prima riga nel metodo qui sotto. Ma che dire delle proprietà sul parametro che non dovrebbero essere nulle? Se provo a gestire nello stesso modo, ottengo un errore di analisi del codice:Il modo migliore per gestire le proprietà nulle su un parametro del metodo

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 
} 

è l'errore CA qualcosa che dovrei sopprimere, o c'è un modo generalmente accettato di gestire meglio questo? Forse il problema è a monte e non dovremmo nemmeno controllare che le proprietà siano nulle a questo punto?

+1

Sì, il messaggio di errore dell'analisi del codice sembra stupido. Questo mi sembra perfetto. Roba come questa è la ragione per cui non ho mai usato il software di analisi del codice prima ... – Jashaszun

+2

'IvSimulation' dovrebbe impedire la costruzione di valori non validi, quindi dovrebbe validare' SolarPanel' e 'GlobalEquipment'. – Lee

risposta

5

Il lancio di un ArgumentNullException ha lo scopo di indicare che l'argomento stesso è null. Tuttavia, quando uno dei componenti argomento è null, ma l'argomento in sé non è, l'eccezione è corretta ArgumentException con il nome dell'argomento come parametro:

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

Ciò fornisce le informazioni sull'errore nel messaggio, specificando ivSimulation come nome del parametro.

Nota: suppongo che non hai scelta di convalidare GlobalEquipment nel costruttore di IvSimulation, perché gettando ArgumentNullException sarebbe una scelta perfettamente valido in quel costruttore.

+1

Si potrebbe fare qualcosa di simile: 'buttare nuova ArgumentException (" Global Equipment non può essere null "," ivSimulation ");' per dare maggiori informazioni. –

+0

@EricHotinger Questa è una scelta migliore, grazie mille! – dasblinkenlight

+0

Preferirei una ** NullReferenceException ** ("L'eccezione che viene lanciata quando c'è un tentativo di dereferenziare un riferimento ad un oggetto nullo.") Invece di una ArgumentException ("L'eccezione che viene generata quando uno degli argomenti forniti a un metodo non è valido. ") perché l'argomento stesso è valido, ma è nullo. – khlr

1

Si può sostenere che una proprietà nullo su una variabile di parametro non nullo non è in realtà un argomento nullo, quindi in questo caso lo ArgumentNullException non è appropriato. (Chiaramente, altri potrebbero non essere d'accordo, il che va bene.) Mi sembra una situazione qualitativamente diversa. L'argomento non è mancante, ma è in uno stato non valido. Penso che userò un InvalidOperationException per casi come questo, in cui un oggetto è in uno stato non valido.

Problemi correlati