1
2
3 Ahol a Java jobb - KTO-nak ajánlva
4
5
6 A kivétel-specifikáció része a függvény és ezen keresztül
7 az osztály interfészének.
8
9 A C++ fordító sajnos nem képes ellenőrizni az összes lehetséges
10 kivételt fordítási időben.
11
12
13
14 C++ void f() { g(); } // nem tudjuk, lesz-e kivétel
15
16 -----------------------------------------
17
18 C void g() { h(); } // C "lenyeli"
19
20 -----------------------------------------
21
22 C++ void h() throw (E) { throw E(); }
23
24
25
26
27
28
29
30
31
32 class E1;
33 class E2;
34
35 // a C++ -ban nem kötelező a kivételeket specifikálni
36 // a függvények szignatúrájában. De leheséges.
37
38 void f() throw(E1) // Csak E1 és származtatott osztályait dobja
39 {
40 ...
41 throw E1(); // OK: E1 dobható
42 ...
43 throw E2(); // unexpected() hívása, ami terminate()-et hív
44 }
45
46
47 // Lényegében erre fordul le:
48 void f()
49 try {
50 ...
51 }
52 catch(E1) { throw; } // újradobja
53 catch(...) { std::unexpected(); }
54
55
56 //============================================
57
58 class E1;
59 class E2;
60
61 void f() throw(E1,std::bad_exception) // csak E1 és leszármatottai
62 { // vagy bad_exception
63 ...
64 throw E1(); // ok.
65 ...
66 throw E2(); // unexpected() bad_exception-t fog dobni, ok.
67 }
68
69
70
71 typedef void (*unexpected_handler)();
72 unexpected_handler set_unexpected(unexpected_handler);
73
74 typedef void (*terminate_handler)();
75 terminate_handler set_terminate(terminate_handler);
76
77 // terminate() alapértelmezésként abort()-ot hív
78
79
80 void f() throw() { } // ksiebb és gyorsabb kódot fordíthat
81
82
83
84
85 Biztos, hogy mindig jó a kivételeket specifikálni?
86