[ 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?
[ 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().
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.

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.
U svakom slučaju slažem se sa citatom iz knjige i to tako i jest, no ono što sam pisao odnosi se na interpretacije.

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.