2015-07-22 10 views
6

Podczas sprawdzania parametru metody wyrzucam ArgumentNullException, jeśli jest on pusty. Zobacz pierwszy wiersz w poniższej metodzie. Ale co z właściwościami parametru, które nie powinny mieć wartości NULL? Jeśli staram się obsługiwać je w ten sam sposób, pojawia się błąd analizy kodu:Najlepszy sposób na obsługę właściwości pustych w parametrze metody

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 
} 

jest błąd coś CA powinien tłumić, czy istnieje ogólnie przyjęty sposób, aby lepiej sobie z tym poradzić? Być może problem jest w fazie początkowej i nie powinniśmy nawet sprawdzać, czy w tym momencie właściwości są zerowe?

+1

Tak, ten komunikat o błędzie analizy kodu wygląda głupio. Wydaje mi się to całkowicie w porządku. Rzecz w tym, dlatego nigdy wcześniej nie korzystałem z oprogramowania do analizy kodu ... – Jashaszun

+2

'IvSimulation' powinien zapobiegać konstruowaniu nieprawidłowych wartości, więc powinien potwierdzać' SolarPanel' i 'GlobalEquipment'. – Lee

Odpowiedz

5

Rzucanie ArgumentNullException ma na celu wskazanie, że argumentem jest null. Jednak, gdy jeden ze składników argument jest null, ale sam nie jest argumentem, właściwa Wyjątkiem jest ArgumentException z nazwą argumentu jako parametr:

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

ta dostarcza informacji na temat błędu w komunikacie, określając ivSimulation jako nazwę parametru.

Uwaga: Zakładam, że nie masz wyboru walidacji GlobalEquipment w konstruktorze IvSimulation, ponieważ rzuca ArgumentNullException byłby całkowicie poprawny wybór w tym konstruktora.

+1

Możesz zrobić coś takiego: 'throw new ArgumentException (" Globalny sprzęt nie może być pusty "," ivSimulation ");' dać więcej informacji. –

+0

@EricHotinger To naprawdę lepszy wybór, dziękuję bardzo! – dasblinkenlight

+0

Wolałbym ** NullReferenceException ** ("Wyjątek, który jest zgłaszany, gdy istnieje próba dereferencji odwołania do obiektu zerowego.") Zamiast wyjątku ArgumentException ("Wyjątek, który jest generowany, gdy jeden z argumentów dostarczonych do metoda jest niepoprawna. "), ponieważ sam argument jest poprawny, ale ma wartość NULL. – khlr

1

Można argumentować, że właściwość pusta dla zmiennej o wartości innej niż null nie jest tak naprawdę argumentem zerowym, więc ArgumentNullException nie jest w tym przypadku właściwa. (Najwyraźniej inni mogą się nie zgadzać, co jest w porządku.) Wydaje mi się, że to zupełnie inna sytuacja. Argument nie występuje, ale jest w niepoprawnym stanie. Myślę, że użyłbym InvalidOperationException w takich przypadkach, gdy obiekt jest w nieprawidłowym stanie.

Powiązane problemy