2015-06-22 9 views
8

Z tego co widziałem, ArgumentExceptions są zwykle używane takie jak:Prawidłowe użycie wyjątku ArgumentException?

public void UpdateUser(User user) 
{ 
    if (user == null) throw new ArgumentException("user"); 
    // etc... 
} 

ale co zrobić, jeśli mam coś takiego:

public void UpdateUser(int idOfUser) 
{ 
    var user = GetUserById(idOfUser); 
    if (user == null) throw new ArgumentException("idOfUser"); 
    // etc... 
} 

Czy to wciąż ArgumentException?

+7

technicznie pierwsze powinno być 'ArgumentNullException' ... – xanatos

+5

Na drugim [tutaj] (http://stackoverflow.com/q/21146594/613130) (w komentarzach) sugerują' ObjectNotFoundException' – xanatos

+1

@xanatos - te 2 komentarze tworzą 1 odpowiedź –

Odpowiedz

0

Jak sama nazwa wskazuje, ArgumentException jest wyjątkiem dotyczącym argumentu. Oznacza to, że argument był w jakiś sposób z natury niesłuszny.

Ogólna forma to:

public void SomeMethod(SomeType arg) 
{ 
    if(!TestArgValid(arg)) 
    throw new ArgumentException("arg"); //Or more specific is possible 
             //e.g. ArgumentNullException 
    /* Actually do stuff */ 
} 

Jeślitylko możliwy sposób, że GetUserById może nie było to, że było coś z natury błędny z wartością idOfUser wówczas następujący będzie zarówno być takie same w praktyka:

public void UpdateUser(int idOfUser) 
{ 
    if(!TestValid(idOfUser)) 
    throw new ArgumentException("idOfUser"); 
    var user = GetUserById(idOfUser); 
    // Do stuff with user 
} 

public void UpdateUser(int idOfUser) 
{ 
    var user = GetUserById(idOfUser); 
    if(user == null) 
    throw new ArgumentException("idOfUser"); 
    // Do stuff with user 
} 

I jeśli okazało się, być z jakiegoś powodu szybsze lub mniej rozrzutny jakiegoś zasobu przetestować user po fakcie niż idOfUser przed faktem i jeśli nie było żadnych skutków ubocznych nazywając GetUserById i jeśli różnica rzeczywiście liczyło wówczas może drugi wersja byłaby rozsądną optymalizacją pierwszego.

Ale to tylko trzyma, jeśli wszystkie jeżeli s wyżej zawieszone, a to wtedy dziwny sposób wykryć nieprawidłowy argument, że ma jakąś szczególną zaletę, gdzie korzystamy z hermetyzacji metod ukrywając, że tajemniczości od wszystkiego .

Istnieje prawdopodobieństwo, że istnieje ważny idOfUser, dla którego nie było odpowiadającego user, w którym to przypadku z pewnością nie był to wyjątek argumentu.

3

Pierwszy

if (user == null) throw new ArgumentException("user"); 

powinny być

if (user == null) throw new ArgumentNullException("user"); 

miarę możliwości nie należy rzucać ArgumentException bezpośrednio

klas

Podstawowym pochodzące z ArgumentExceptionArgumentNullException i ArgumentOutOfRangeException. Te klasy pochodne powinny być używane zamiast ArgumentException, z wyjątkiem sytuacji, w których żadna z klas pochodnych nie jest akceptowalna.

Na drugim przykładzie tutaj Should I throw a KeyNotFoundException for a database lookup? sugerują (w komentarzach)

if (user == null) throw new ObjectNotFoundException(); 

Jest ona zdefiniowana w System.Data: System.Data.ObjectNotFoundException.

+0

Znajduje się w przestrzeni nazw System.Data, ale wymaga dodania biblioteki Entity do projektu. – Rhs

Powiązane problemy