[ glorius @ 16.10.2007. 23:25 ] @
Evo primera: Code: void MojaFunkcija() throw() { // bla bla } Kako ona 'baca' izuzetak? Da li ga catch - ujem sa catch(...) posto izuzetak nije naveden? |
[ glorius @ 16.10.2007. 23:25 ] @
[ karas @ 17.10.2007. 07:37 ] @
Ovako deklarisana funkcija ne sme da baca izuzetke. Ako ga ipak baci, onda se program prekida, tj. poziva se unexpected)() koja poziva terminate() a ova opet abort().
[ itf @ 17.10.2007. 08:26 ] @
Citat: karas: Ovako deklarisana funkcija ne sme da baca izuzetke. Ako ga ipak baci, onda se program prekida, tj. poziva se unexpected)() koja poziva terminate() a ova opet abort(). Ovo je na neki način samo podsjetnik programerima ukoliko imaju veći broj funkcija koje bacaju iznimke, pa onda unutar tog throw-a pri deklaraciji funkcije navedu sve tipove iznimki koje ta funkcija može baciti. Ipak, u svakom slučaju je preporučljivo zaštiti se i s catch(...) [ karas @ 17.10.2007. 09:22 ] @
Citat: itf: Ako je pri deklaraciji funkcije naveden throw bez argumenata onda to znači da takva funkcija ne bi trebala bacati nikakve iznimke. Obično se onda taj throw i izostavi. Hm, zašto onda C++ Primer kaže: Citat: If a function declaration does not specify an exception specification, the function can throw exceptions of any type. [ glorius @ 17.10.2007. 10:26 ] @
Hvala momci! Inace, Visual Studio daje warning ako se baci izuzetak funkciji koja ima u deklaraciji 'sufiks' throw().
Mada, ipak mi se cini da throw() i izostavljanje nije isto! Jer, kada se throw() izostavi, nema warninga! Primer ( VS 2003 ), izostavite throw() i videcete da nema warninga :) Code: #include <iostream> int funkcija(int a) throw() { if( a > 0 ) throw "Greska"; } void main() { try { funkcija(5); } catch (char * a) { std::cout << a; } } [ itf @ 17.10.2007. 10:36 ] @
To je sve stvar primjene i tvoje interpretacije. Ako redom pišeš prototipe funkcija i za svaku navodiš koje iznimke može da baci onda je (barem meni) na neki način logično da ako nisi ništa napisao da takva funkcija ništa ni ne baca.
[ karas @ 17.10.2007. 11:20 ] @
throw() znači da funkcija ne baca izuzetke a izostanak throw() deklaracije da funkcija može da baci bilo koji izuzetak, str. 376 u The C++ Programming Language, 3rd edition. Zato se VS tako i ponaša.
Možda je to tako izvedeno kako bi se biblioteke pisane dok nije postojala ova konstrukcija jezika uklopile bez izmena. [ itf @ 17.10.2007. 11:58 ] @
Citat: karas: throw() znači da funkcija ne baca izuzetke a izostanak throw() deklaracije da funkcija može da baci bilo koji izuzetak, str. 376 u The C++ Programming Language, 3rd edition. Zato se VS tako i ponaša. Možda je to tako izvedeno kako bi se biblioteke pisane dok nije postojala ova konstrukcija jezika uklopile bez izmena. iako throw() znači da funkcija ne baca ništa ja to ionako nikad ne pišem jer je to jednostavno... nepotreban posao ;) [ glorius @ 17.10.2007. 22:03 ] @
Ehej, evo mesta gde bi se throw() mogao iskoristiti...
class Exception { UradiNeshtoKadaDodjeDoIzuzetka() throw () { ... } }; Ne ocekuje se da klasa koja oznacava izuzetak u svojim metodama negde 'zezne' stvar... Mada, i to je mozda moguce :) Mada, i ovo deluje kao bespotrebno ali, u slozenim programima mozda i ima smisla... Exception couse the exception... wierd :P Ah da.. prvi put se sretoh sa ovim pojmom ( throw() ) u knjizi The C++ Standard Library: A Tutorial and Reference - Nicolai M. Josuttis Simpaticna knjiga koja objasnjava STL sa poooodooosta primera. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|