znaku powoduje błąd ponieważ cin oczekuje liczby całkowitej typu int, jeśli cin ma wartość false, oznacza to, że wystąpił błąd) while ( ! ( c i n...

Pokaż mi serce nie opętane zwodniczymi marzeniami, a pokażę ci człowieka szczęśliwego.


c i n . c l e a r ( ) ;
W celu odrzucenia wejścia (kasowanie zawartości bufora) możemy użyć funk-
cji ignore().
c i n . i g n o r e ( 1 0 0 , ’ \n ’ ) ;
W powyższym przykładzie będzie odrzuconych 100 kolejno wczytanych zna-
ków, chyba, że wcześniej będzie napotkany znak nowego wiersza \n.
11.4. Narzędzie assert() i funkcja abort()
Zagadnienie zapobiegania błędom jest ważne, dlatego też programiści
korzystający z języka C i C++ maję całkiem dobre narzędzie diagnostyczne
jakim jest makro o nazwie assert(). Makro assert() pobiera wyrażenie całko-
238
11. Techniki obsługi błędów
wite i je testuje. Jeżeli wyrażenie jest fałszywe, wysyłany jest komunikat błę-
du do standardowego wyjścia dla błędów (stderr) i wywoływana jest funkcja
abort(), która kończy program. W języku C assert() znajduje się w pliku
nagłówkowym assert.h , natomiast abort() w pliku stdlib.h. Po przerwaniu
programu przez assert() wyświetlony jest warunek, który nie został spełnio-
ny, nazwa pliku i numer wiersza. W języku C++ aby stosować asercję należy
zastosować dyrektywę #include <cassert> lub #include<assert.h>.
Listing 11.6. Wykorzystanie asercji do obsługi błędów
1 #i n cl u d e <i o s t r e a m >
#include <math>
3 #i n cl u d e <c o n i o . h>
#include <a s s e r t . h>
5
i n t main ( )
7
{
using namespace s t d ;
9
i n t x , y ;
f l o a t m;
11
c o u t << " ␣ Podaj ␣x␣ : ␣ " ;
c i n >> x ;
13
c o u t << " ␣ Podaj ␣y␣ : ␣ " ;
c i n >> y ;
15
m = x∗x − y∗y ;
a s s e r t (m >= 0 ) ;
17
c o u t << " ␣ P i e r w i a s t e k ␣ z ␣ " << m << " ␣=␣ " << s q r t (m) ;
g e t c h e ( ) ;
19
return 0 ;
}
Jeżeli w programie nie będzie instrukcji:
a s s e r t (m >= 0 ) ;
to przykładowe wykonanie programu może mieć postać:
Podaj x : 1
Podaj y : 4
s q r t : DOMAIN e r r o r
P i e r w i a s t e k z −15 = nan
Jeżeli w programie umieścimy asercje to program z tymi danym nie urucho-
mi się, nastąpi przerwanie programu i powrót do środowiska programistycz-
nego.
Obsługę błędu bardzo podobną do wywołania makra assert() jest wy-
wołanie funkcji abort(). Zmodyfikujemy poprzedni program, rezygnując z
assert() na rzecz zastosowania funkcji abort().
11.5. Przechwytywanie wyjątków
239
Listing 11.7. Wykorzystanie funkcji abort() do obsługi błędów
#include <ios t r e am >
2 #i n cl u d e <math>
#include <c o n i o . h>
4 #i n cl u d e < c s t d l i b >
i n t main ( )
6
{
using namespace s t d ;
8
i n t x , y ;
f l o a t m;
10
c o u t << " ␣ Podaj ␣x␣ : ␣ " ;
c i n >> x ;
12
c o u t << " ␣ Podaj ␣y␣ : ␣ " ;
c i n >> y ;
14
m = x∗x − y∗y ;
i f ( m <= 0 )
16
{ c o u t << " ␣ argument ␣w␣ s q r t ␣ ujemny " ;
a b o r t ( ) ;
18
}
c o u t << " ␣ P i e r w i a s t e k ␣ z ␣ " << m << " ␣=␣ " << s q r t (m) ;
20
g e t c h e ( ) ;
return 0 ;
22
}
Zaleca się stosowanie makra assert(), ponieważ w wyniku jego działa-
nia otrzymujemy więcej informacji na temat błędu (np. numer wiersza, w
którym błąd wystąpił).
11.5. Przechwytywanie wyjątków
Język C++ posiada bardzo wydajny mechanizm obsługi błędów, nazy-
wany obsługą wyjątków. Obsługa wyjątków pozwala programiście zarządzać
błędami wykonania w sposób zorganizowany, dający poczucie bezpieczeń-
stwa. Konstrukcje związane z obsługą wyjątków w języku C++ związana
jest z trzema słowami kluczowymi:
— try - próbuj, testuj, sprawdzaj
— throw - wyrzuć, zgłoś, sygnalizuj, prześlij
— catch - złap, przechwyć.
Copyright (c) 2009 Pokaż mi serce nie opętane zwodniczymi marzeniami, a pokażę ci człowieka szczęśliwego. | Powered by Wordpress. Fresh News Theme by WooThemes - Premium Wordpress Themes.