To tylko jedna z 29 stron tej notatki. Zaloguj się aby zobaczyć ten dokument.
Zobacz
całą notatkę
Obsługa wyjątków Wykład 8 10/11/29 2 Powody wprowadzenia obsługi wyjątków Podczas wykonania programu mogą wystąpić przypadki, które nie zostały przewidziane przez programistę Np. użytkownik wprowadził złe dane Kontakt z urządzeniem zewnętrznym został przerwany W celu uniknięcia przerwania pracy programu konieczne jest zaimplementowanie obsługi błędów Jedną z możliwości jest obsługa błędów poprzez znaczniki statusów (używane w C) W C++ natomiast wprowadzono nowy znacznie ogólniejszy mechanizm pozwalające na obsługę wyjątków 10/11/29 3 Obsługa wyjątków Wyjątek nie zawsze oznacza błąd Błąd jest niejako podzbiorem wyjątków Sytuacją wyjątkową (wyjątkiem) może być wszystko co my programiści za to uznamy Obsługa wyjątków stanowi nowy sposób obsługi błędów i sytuacji nazwijmy to niecodziennych Należy stosować kiedy tylko jest to możliwe Stanowi wbudowaną własność języka Umożliwia obsługę wyjątków w każdym ich znaczeniu za pomocą mechanizmu niezależnego od zasadniczego przepływu sterowania w programie 10/11/29 4 Obsługa błędów poprzez znaczniki statusów (C) Odbywa się poprzez kontrolę wartości zwracanych przez funkcję i wywoływaniu procedur obsługujących błędy Błędy są wykrywane i obsługiwane przez kod programu Nie ma różnicy między zwykłym przepływem sterowania programem, a obsługą błędów Standardowy przepływ jest wymieszany z blokami obsługi błędów Wystąpienie błędu sygnalizowane jest jakąś specjalną wartością zwracaną Pojawią się problemy kiedy funkcja jako legalną wartość może zwrócić zbiór pełny (np. wszystkie liczby typu int lub znaki, itp.) 10/11/29 5 Języki obiektowe (C++) W takich językach wiele operacji w ogóle nie zwraca żadnej wartości, czyli nie ma możliwości zwrócenia wartości sygnalizującej błąd Np. tworzenie nowych obiektów (wywoływany jest konstruktor) Wykrycie błędu to nie jeden problem, istotne jest również poprawne jego obsłużenie Istnieje potrzeba wbudowania mechanizmu, który pozwoliłby na oddzielenie wykrywania błędów od ich obsługi oraz umożliwiał przekazywanie informacji w inny sposób niż parametry zwracane Właśnie obsługa wyjątków daje takie możliwości 10/11/29 6 Koncepcja obsługi wyjątków Wyjątki przetwarzane są w języku C++ w następujący sposób Jeżeli niespodziewana sytuacja wystąpi wewnątrz
(…)
… wszystkie obiekty automatyczne
zostają zniszczone
Jeżeli argumentem instrukcji throw jest obiekt
automatyczny to on też zostanie zniszczony
Dlaczego obiekt kopiowany jest do obszar statycznego?
Ale informacja zostanie przekazana przez jego kopię,
umieszczoną w obszarze zmiennych statycznych
Kompilator np. nie tworzy obiektu operatorem new, gdyż
właśnie brak pamięci może być przyczyną wyrzucenia wyjątku
Przykład cpp_8.6
10/11/29
18
throw i argumenty nieautomatyczne
Oczywiście możemy za pomocą instrukcji
throw rzucać obiekty nieautomatyczne
Obiekty globalne
Obiekty stworzone operatorem new (jeżeli
powód rzucenia wyjątku nie jest brak pamięci)
Jednak niezależnie jaki obiekt będziemy
wyrzucać to catch zawsze odbiera kopię
tego obiektu
Przykład cpp_8.7
10/11/29
19
Wyjątki w destruktorach…
…
out_of_range
ios_base::failure
range_error
runtime_error
bad_exception
10/11/29
overflow_error
underflow_error
26
Standardowe klasy wyjątków...
Zdefiniowane są w pliku nagłówkowym exception (w
większości)
Definiowane nasze klasy wyjątków powinny być
pochodne względem std::exception
W klasie std::exception zdefiniowana jest
wirtualna metoda what(), która zwraca komunikat
specyficzny dla danej…
... zobacz całą notatkę
Komentarze użytkowników (0)