2012-10-12 12 views
39

Jeśli mam metodę sprawdzającą poprawność jej argumentów, czy można wrzucić własne niestandardowe wyjątki pochodzące z System.ArgumentException? Pytam, ponieważ ArgumentException sam pochodzi z System.SystemException i widzę sprzeczne wytyczne, czy aplikacja powinna pochodzić z SystemException. (Choć pośrednio, czerpiąc z ArgumentException jest jeszcze równoznaczne z wynikającymi z SystemException.)Czy można wyprowadzić z System.ArgumentException?

widzę wiele wytycznych mówiąc nie wywodzą się z ApplicationException, ale wynikają z Exception zamiast. Jestem z tego zadowolony. Nie jestem pewien, czy można czerpać korzyści z SystemException.

Jeśli nie powinienem czerpać z SystemException, z czego należy wywnioskować moje klasy wyjątków "invalid argument"?

+2

Jeśli podane parametry są niepoprawne, oczekuje się, że metoda wyśle ​​"ArgumentException". Możesz w pełni z niego korzystać w takich przypadkach.Wyprowadzanie z 'SystemException' nie ma sensu, ale rzucasz' ArgumentNullException', jeśli argument ma wartość null lub 'ArgumentOutOfRangeException', jeśli jest poza dopuszczalnym zakresem. Oba pochodzą z 'ArgumentException'. Tak więc wyrzucanie niestandardowego wyjątku, który nie jest pochodną 'ArgumentException' w takich przypadkach, jest IMHO czymś, czego nie należy robić *. Więc pójdę z odpowiedzią Botz3000. –

Odpowiedz

40

MSDN page about Best Practices for Handling Exceptions mówi

Rzut ArgumentException lub klasę pochodzącą z ArgumentException jeśli nieprawidłowe parametry są przekazywane.

Powiedziałbym, że jest ok, a nawet zalecane.

+0

Dzięki Botz, twoja odpowiedź przekonała mnie do używania ArgumentException. –

5

Jeśli chcesz czerpać swoje „Nieprawidłowy argument” wyjątki i nie mają znaczenia poza tym, czym ArgumentException brzmi rozsądnym kandydata:

ArgumentException jest generowany, gdy metoda jest wywoływana a przynajmniej jeden z przekazanych argumentów nie spełnia specyfikacji parametru wywołanej metody. --MSDN

2

Jeśli jesteś 100% ponowne właściwości ArgumentException i dodać kilka dodatkowych funkcji to byłoby OK. Jednak gdy użyjesz go tylko ze względu na jego nazwę, nie będzie w porządku.

7

Jedną z korzyści wynikających z wyjątku System.ArgumentException jest to, że bloki catch(System.ArgumentException) będą w stanie obsłużyć niestandardowy typ wyjątku, a także System.ArgumentException. To może, ale nie musi być to, co chcesz.

4

Oryginalny Ideą wyjątków w .NET, że wyjątki w bibliotekach klasy bazowej (np zespoły systemowe) rzucał wyjątki, które pochodzą od System.Exception i poinformowała, że ​​wszystkie niestandardowe wyjątki dziedziczą System.ApplicationException odróżnić BCL wyjątków i odstępstw aplikacyjnych jednak firma Microsoft wycofała się z tego pomysłu i teraz sugeruje, że wszystkie wyjątki dziedziczą po System.Exception.

Moja rada to dziedziczyć od najniższej klasy Exception w ramach, która ma sens.

Jeśli twój wyjątek oznacza coś innego niż problem z tym argumentem, np. typ może dodawać semantykę do wyjątku (tak jak robimy ArgumentNullException i ArgumentOutOfRangeException), a następnie utworzyć niestandardową, jeśli nie, po prostu użyć ArgumentException i dostarczyć znaczący komunikat wyjątku.

+0

Wyjątki od użytkowników miały pochodzić z wyjątku ApplicationException, a nie SystemException. –

+0

Dobrze zauważyłem, pisałem w tym poście wyjątek zbyt często, poprawię go! –

Powiązane problemy