Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałEdyta Szymańska Został zmieniony 8 lat temu
1
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
2
Mechanizm obsługi sytuacji wyjątkowych wykorzystuje się, gdy wiemy, że program nie będzie w stanie wykonać poprawnych obliczeń. W takiej sytuacji „rzucamy” wyjątek, czyli przerywamy obliczenia i „przeskakujemy” do procedury obsługi wyjątku.
3
Mechanizm obsługi sytuacji wyjątkowych 1.Określenie, gdzie zaczyna się obszar, w którym może wystąpić sytuacja wyjątkowa. try – spróbuj 2.Gdy zaistnieje sytuacja wyjątkowa rzucenie wyjątku. throw – rzuć 3.Określenie reakcji na wystąpienie sytuacji. catch – złap
4
try { //tu coś może się nie udać throw 1;//coś się nie udało } catch(int) { //reakcja na sytuację wyjątkową }
5
Co może być sytuacją wyjątkową? O tym decyduje programista. Sytuacją wyjątkową może być wszystko, co my wewnątrz programu za taką uznamy.
6
Kiedy stosować mechanizm obsługi sytuacji wyjątkowych? Gdy dwa odmienne fragmenty kodu muszą ze sobą współpracować: jeden potrafi wykryć sytuację wyjątkową, ale nie potrafi nic na nią poradzić, drugi wie, co zrobić, ale nie potrafi jej wykryć.
7
double suma(string nazwa) { ifstream plik(nazwa.c_str()); if (plik.good()) { int s=0, li; while (!plik.eof()) { plik>>li; s+=li; } return s; } else { //return ?? }
8
double suma(string nazwa) { ifstream plik(nazwa.c_str()); if (!plik.good()) throw 1; int s=0, li; while (!plik.eof()) { plik>>li; s+=li; } return s; } int main() { string nazwa="dane.txt"; double s; for(;;) { try { s=suma(nazwa); break; } catch (int) { cout<<"Podaj nazwe pliku\n"; cin>>nazwa; } cout<<s<<endl; return 0; }
9
throw vs return Mechanizm obsługi sytuacji wyjątkowych umożliwia powrót z funkcji inny niż za pomocą instrukcji return. Różnica w obiektach zwracanych: argumentem return musi być obiekt określonego typu, argumentem throw może być obiekt dowolnego typu. Różnica w przeniesieniu sterowania: instrukcja return powoduje powrót do miejsca wywołania funkcji, instrukcja throw powoduje przejście do procedury obsługi sytuacji wyjątkowej – odpowiedni blok catch.
10
Po zakończeniu procedury obsługi wyjątku nie następuje żaden powrót do miejsca skąd rzucono wyjątek. Po zakończeniu wykonywania bloku catch zaczyna się wykonywanie instrukcji znajdujących się po wszystkich blokach catch.
11
Kolejność bloków catch ma znaczenie (analogicznie jak w przypadku else if). try { throw 1; } catch(int){cout<<"int"<<endl;} catch(double){cout<<"double"<<endl;} catch(char){cout<<"char"<<endl;}
12
Który blok catch wybiera kompilator? Pierwszy pasujący, czyli: rzucamyoczekujemy T->T T->const T T->T & T*->void*obiekt klasy-> klasy podstawowej pochodnej
13
void f(int a){cout<<"int\n";} void f(...){cout<<"...\n";} int main() { f(1.0); return 0; } int main() { try { throw 1.0; } catch(int){cout<<"int\n";} catch(...){cout<<"...\n";} return 0; } int …
14
try { throw 1; } catch(...){cout<<"int\n";} catch(int){cout<<"...\n";} BŁĄD
15
Zagnieżdżanie bloków try try { try { throw 1; } catch (long){cout<<"long\n";} catch (int){cout<<"int\n";} } catch(int){cout<<"int\n";} catch(double){cout<<"double\n";} int
16
try { try { throw 1; } catch (long){cout<<"long\n";} catch (char){cout<<"char\n";} catch (...){cout<<"...\n";} } catch(int){cout<<"int\n";} catch(double){cout<<"double\n";} …
17
Re-throw try { try { throw 1; } catch (long){cout<<"long\n";} catch (char){cout<<"char\n";} catch (...){cout<<"...\n";throw;} } catch(int){cout<<"int\n";} catch(double){cout<<"double\n";} int …
18
Można sprawdzać jaką wartość ma rzucony obiekt. try { throw 1; } catch(int a){cout<<"int = "<<a<<endl;} int = 1
19
W przypadku bloków try i catch obowiązują normalne zakresy ważności. try { int a=2; throw a; } catch(int) { cout<<"int = "<<a<<endl; } BŁĄD
20
Funkcja exit Deklaracja: void exit(int status); Jest to funkcja, która kończy działanie programu, ale wcześniej zamyka wszystkie pliki oraz opróżnia wszystkie bufory.
21
Funkcja abort Deklaracja: void abort(); Jest to funkcja, która kończy działanie programu (brutalnie).
22
Funkcja terminate Deklaracja: void terminate(); Jest to funkcja wywoływana przez kompilator w chwili, gdy żaden z bloków catch nie złapie wyjątku. Funkcja ta wywołuje funkcję abort.
23
Funkcja set_terminate Deklaracja: (void (*wsk)()) set_terminate(void (*wsk)()); Jest to funkcja, która mówi kompilatorowi, jaką funkcję ma wywołać z funkcji terminate.
24
void nie_zlapano() { cout<<"Nie zlapano wyjatku\n"; exit(0); } int main() { set_terminate(nie_zlapano); try { throw 1; } catch(double) {cout<<"double\n";} } Nie zlapano wyjatku
25
int main() { set_terminate(nie_zlapano); try { throw 1; } catch(int) { cout<<"int\n"; try { throw 1.0; } catch (int){cout<<"int\n";} } catch(double){cout<<"double\n";} catch(char){cout<<"char\n";} } int Nie zlapano wyjatku
26
Deklarując funkcję możemy podać jakie wyjątki funkcja może rzucać, np.: void fun();funkcja rzuca dowolny wyjątek void fun() throw (int, double);funkcja rzuca int albo double void fun() throw();funkjca nie rzuca żadnych wyjątków
27
Funkcja unexpected Deklaracja: void unexpected(); Jest to funkcja wywoływana przez kompilator w chwili, gdy z wnętrza funkcji zostanie rzucony nieoczekiwany wyjątek. Funkcja ta wywołuje funkcję terminate.
28
Funkcja set_unexpected Deklaracja: (void (*wsk)()) set_unexpected(void (*wsk)()); Jest to funkcja, która mówi kompilatorowi, jaką funkcję ma wywołać gdy rzucony zostanie wyjątek niespodziewany.
29
void fun() throw(int) { throw 1.0; } void niespodziewany() { cout<<"Wystapil niespodziewany wyjatek"; exit(0); } int main() { set_unexpected(niespodziewany); try { fun(); } catch(int) { cout<<"int\n"; } return 0; }
30
goto for(;;){ goto koniec; } koniec:
31
throw try{ for(;;){ throw 1; } catch (int){}
32
Wyjątki standardowe można znaleźć w Thinking in C++ tom II Bruce Eckel Dostępne http://helion.pl/online/thinking/index.html
33
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: http://creativecommons.org/licenses/by-sa/3.0/deed.pl
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.