W wielu językach wyjątki to niemal obowiązkowa metoda zgłaszania i obsługi błędów. W innych (tj. w C++) jest ona w dużym stopniu opcjonalna. W obu przypadkach istnieją zwykle dostępne out-of-the-box klasy wyjątków, których obiekty można wyrzucać, bez tworzenia swoich własnych. Ich używanie jest zdecydowanie wskazanie. Warto więc przyjrzeć się, jakie predefiniowane obiekty wyjątków przewidują standardowej biblioteki różnych języków.
I tak w C++ mamy bazową klasę exception
, która zawiera w sumie niewiele więcej ponad komunikat o błędzie. Zresztą dotyczy to tak naprawdę wszystkich wbudowanych w C++ klas wyjątków; tym, co je rozróżnia, jest po prosty typ. Mamy tu prostą hierarchię dziedziczenia, wyróżniającą klasy bazowe: runtime_error
dla niskopoziomowych błędów czasu wykonania (jak na przykład overflow_error
) oraz logic_error
dla błędów logicznych aplikacji. Z tej drugiej, bardziej dla nas interesującej, wyprowadzone są też wyjątki nieco bardziej szczegółowe, jak np.: invalid_argument
, range_error
, domain_error
czy lenght_error
. Wszystkie cztery są zresztą podobne do siebie pojęciowo i wydają się służyć głównie do sygnalizowania nieprawidłowych wartości argumentów funkcji. Do innego rodzaju błędów sensowniej jest używać klas bazowych lub niestety napisać własne (najlepiej dziedziczące z nich).
Na platformie .NET i w Javie jest z tym dużo lepiej – tam typów wyjątków jest niemal za dużo. Nie ma tu miejsca na omawianie ich wszystkich i nie jest to zresztą konieczne, gdyż nazwy klas są zwykle wystarczające do zorientowania się, z jakim rodzajem błędu mamy tu do czynienia. Według mnie najczęstszymi sytuacjami, w których można wyrzucić obiekt którejś z natywnych klas, są:
System.ArgumentException
/ java.lang.IllegalArgumentException
null
-em w sytuacji, gdy wymagany jest obiekt – System.ArgumentNullException
System.IndexOutOfRangeException
/ java.lang.IndexOutOfBoundsException
System.InvalidOperationException
/ java.lang.IllegalStateException
System.NotImplementedException
System.NotSupportedException
/ java.lang.UnsupportedOperationException
System.IO.IOException
/ java.io.IOException
System.TimeoutException
/ java.util.concurrent.TimeoutException
Można zauważyć, że dla większości pozycji odpowiadające klasy wyjątków istnieją na obu platformach i nawet nazywają się podobnie. Zapewne to kolejny znak wzajemnej inspiracji ich twórców ;)
Natywne w C++ jest nieużywanie wyjątków :)
http://9fingers.pl/questions/845/Stosowanie-wyjatkow
http://devpytania.pl/questions/1465/czy-uzywac-wyjatkow
a tu ponoć coś ciekawego: http://www.vollmann.ch/en/pubs/cpp-excpt-alt.html
;-)
NA STOS! Wyjątki to zło.
Na szczęście wyjątki stos odwijają ;p