Rzucać wyjątki, zazwyczaj użyć wbudowanych klas wyjątków, np ArgumentNullException
a NotSupportedException
. Czasami jednak potrzebuję użyć niestandardowego wyjątku iw takim przypadku piszę:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
i tak dalej. Następnie wrzucam i łapię je w moim kodzie. Ale dzisiaj natknąłem się naApplicationException
klasę - czy powinienem zamiast tego używać? Do czego to służy?
Wydaje się nieefektywne, aby mieć wiele skutecznie identycznych klas wyjątków o różnych nazwach (zwykle nie potrzebuję żadnej indywidualnej funkcjonalności). Ale nie podoba mi się pomysł łapania leku generycznegoApplicationException
i konieczności użycia dodatkowego kodu, aby określić, jaki był błąd.
Gdzie powinien ApplicationException
pasować mój kod?
c#
.net
exception
exception-handling
James
źródło
źródło
Odpowiedzi:
Zgodnie z uwagami w msdn:
Wyprowadź je z
Exception
. Nie widzę też problemu z tworzeniem nowych wyjątków dla Twoich spraw, o ile jest to uzasadnione. Jeśli napotkasz przypadek, w którym istnieje już wyjątek we frameworku, użyj go, w przeciwnym razie rzuć własny.źródło
ApplicationException
jest to bezużyteczne i czy istnieje tylko z powodu wstecznej kompatybilności?Krótka odpowiedź brzmi: nigdzie.
Jest to relikt przeszłości, w której Microsoft chciał, aby programiści odziedziczyli wszystkie niestandardowe wyjątki od ApplicationException. Wkrótce zmienili zdanie i doradzili, że wyjątki niestandardowe powinny pochodzić z podstawowej klasy Exception. Zobacz najlepsze rozwiązania dotyczące obsługi wyjątków w witrynie MSDN.
Jednym z bardziej rozpowszechnionych powodów takiego stanu rzeczy jest fragment Jeffery Richter w Framework Design Guidelines :
Więc masz to. Podsumowanie jest takie, że ApplicationException nie jest szkodliwy , po prostu bezużyteczny .
źródło
Whizbang
zdecyduje, że chce mieć wszystkie swoje wyjątki w ramach jakiejś wspólnej hierarchii, użycieApplicationException
do tego celu nie dałoby żadnej przewagi nad używaniem niestandardowejWhizbangException
klasy bazowej. Poważniejszy problem w hierarchii wyjątków .net nie dotyczyApplicationException
jednak, ale niepowodzenia rozdzielenia wyjątków na kategorie prawdopodobnie krytyczne dla aplikacji, prawdopodobnie fatalne wątku i związane z problemem lokalnym, a także brak możliwości znaczące „złożone” wyjątki.finally
zgłoszony podczas bloku, podczas gdy inny wyjątek jest w toku,catch
bloki w górę stosu wywołań powinny być wyzwalane, jeśli pasują do dowolnego zagnieżdżonego wyjątku, ale pozostawiaj inne wyjątki w toku, aby wyjściecatch
blok by przejść do innegocatch
bloku w tym samymtry
bloku, (jeśli są odpowiednie) i wychodzenia zfinally
bloku z wyjątkami w toku by przejść do następnej zewnętrznejcatch
lubfinally
.W początkowym projekcie, w .NET 1.0, planowano, że sam framework będzie rzucał
SystemException
i wyprowadzał; podczas gdy aplikacje użytkownika - wyrzucąApplicationException
i uzyskiwać.Ale później, w .NET 2.0, zostało to odrzucone.
W ten sposób pochodzą z
Exception
.źródło