Primeri koji sam dole naveo (3 komada) su sa C++Builder6, a druga
dva mi daju neocekivane rezultate. Da li ima neki dobrovoljac da
stvar isproba i na drugim kompajlerima da uporedimo rezultate. Bilo
bi dobro i neko sa Delphi-jem, bas me zanima! Nece biti tesko preneti
kod, vrlo je jednostavno.
O cemu se radi. C++ po standardu nema 'finally' komandu, ali je ipak
svi kao ekstenziju isporucuju uz kompajler. Dakle, 'finally' bi treralo da
*u svakom slucaju izvrsi blok* bez obzira sta se desilo u 'try':
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
return;
}
__finally
{
ShowMessage( "Izvrseno bez obzira na return!" );
}
}
Ali:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
try
{
try
{
return;
}
catch ( ... )
{
}
}
__finally
{
ShowMessage( "Nije izvrseno?!" );
}
}
Takodje:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
try
{
try
{
// proizvedite neki izuzetak
int x = StrToInt( "nije_broj" );
}
catch ( ... )
{
return;
}
}
__finally
{
ShowMessage( "Nije izvrseno?!" );
}
}
Desilo se da '__finally' nije izvrsen. U C++ se koristi cuvena
RAII tehnika da se osigura 'čišćenje' ako nesto krene lose -
to znam, ali me zanima da li je i kod drugih kompajlera stvar
kao u ovim primerima.
[Ovu poruku je menjao X Files dana 01.11.2012. u 19:33 GMT+1]