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