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.
technicznie pierwsze powinno być 'ArgumentNullException' ... – xanatos
Na drugim [tutaj] (http://stackoverflow.com/q/21146594/613130) (w komentarzach) sugerują' ObjectNotFoundException' – xanatos
@xanatos - te 2 komentarze tworzą 1 odpowiedź –