Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima

[es] :: C++ programiranje :: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima

[ Pregleda: 1254 | Odgovora: 7 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 2995
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org
Sajt: www.antivari.com


Profil

icon try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima10.02.2005. u 12:53
Pozdrav,

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.

FREEWARE
Di rečnik, v1.0.058 (srp-eng/eng-srp priručni rečnik)
http://www.antivari.com
10.02.2005. u 12:53 

Dragi Tata

Član broj: 1958
Poruke: 3885
66.228.70.*

Sajt: www.novetehnologije.com


Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima10.02.2005. u 12:59
__finally uopšte nije deo C++a (lepo si rekao za RAII), a postoji konstrukcija __try... __finally pod Windows-om, takozvani SEH, koji može da se koristi i iz C-a, ali to je nešto sasvim drugo.
10.02.2005. u 12:59 

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 2995
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org
Sajt: www.antivari.com


Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima10.02.2005. u 13:21
Ma, da - znam da nema 'finally' jos uvek u C++ standardu,
ali mislim da ne postoji C++ kompjler koji to nije uveo kao
ekstenziju. Zanima me kako se drugi kompajleri snalaze sa
pomenutim primerima.

A sto se tice RAII, to je obavezno za profi programe, ja ga
koristim na puno mesta, a najkarakteristicnije je kod
'kriticnih sekcija', npr:

Code:


// --- H ---
class CSLock
{
public:
   LPCRITICAL_SECTION fcs;

   CSLock( LPCRITICAL_SECTION acs ) : fcs( acs )
   { if ( fcs ) EnterCriticalSection( fcs ); }

   ~CSLock()
   { if ( fcs ) LeaveCriticalSection( fcs ); }
};

// --- CPP ---

// KONSTRUKTOR
{
   InitializeCriticalSection( &MyCriticalSection );
}
// DESTRUKTOR
{
   DeleteCriticalSection( &MyCriticalSection );
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   CSLock lock( &MyCriticalSection );
   // Bez obzira sta se desilo, nece doci do dead-locka!
   ShowMessage( "DoSomething()" );
}




FREEWARE
Di rečnik, v1.0.058 (srp-eng/eng-srp priručni rečnik)
http://www.antivari.com
10.02.2005. u 13:21 

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 2995
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org
Sajt: www.antivari.com


Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima10.02.2005. u 13:23
... zaboravih, jos u nekom header-u, treba:
Code:

CRITICAL_SECTION MyCriticalSection;


... naravno!
FREEWARE
Di rečnik, v1.0.058 (srp-eng/eng-srp priručni rečnik)
http://www.antivari.com
10.02.2005. u 13:23 

Dragi Tata

Član broj: 1958
Poruke: 3885
66.228.70.*

Sajt: www.novetehnologije.com


Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima10.02.2005. u 13:30
Citat:
X Files: Ma, da - znam da nema 'finally' jos uvek u C++ standardu,
ali mislim da ne postoji C++ kompjler koji to nije uveo kao
ekstenziju.


Pa ako pogledaš dva najpopularnija kompajlera, VC++ ga ima samo u "managed" modu, a GCC ga koliko znam nema uopšte.

A nema ni planova da se finally uvede u standard - jednostavno, nepotrebno je.
10.02.2005. u 13:30 

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 304
*.neobee.net.



Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima13.02.2005. u 00:09
Ne znam da li je uopste u pitanju sledece (sto se samog posta tice) ali mene licno interesuje:

U druga dva primera __finally se nije izvrsio zato sto postoji catch statement, a kompajler je skontao da kad je Exception handle-ovan on treba da odradi return?
13.02.2005. u 00:09 

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 884
*.plus.com.



Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima13.02.2005. u 02:02
Ovaj sluchaj je vec prijavljen u bug-listu, ali Borland ne nudi reshenje za to :
http://qc.borland.com/wc/qcmain.aspx?d=4249

Izgleda da je bag u preranoj terminaciji exception bloka.
Interesantno, jer da kad zamenish onaj tvoj "bagoviti" kod sa ovim :

Code:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  try
  {
    try
    {
      //return;
      int i=0; int j=1; int r=j/i;
    }
    catch ( ... )
    {
      ShowMessage("Deljenje nulom");
    }
  }
  __finally
  {
    ShowMessage( "Sada je izvrsheno? Zato shto ga je catch uhvatio, ili zato shto ga        return nije izbacio van bloka prerano???" );
  }
}


.... __finally se izvrshava. Chak i kada nije bachen exception, __finally radi korektno.

Da konachno prepishemo ovo Borlandu na teret? :)
13.02.2005. u 02:02 

leka
Dejan Lekić
senior software engineer, 3Developers Ltd.
London, UK

Član broj: 234
Poruke: 2530
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


Profil

icon Re: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima20.02.2005. u 19:16
X Files, ista prica kao sa MFC CKlasama je i ovde - Borlandove TKlase rade UGLAVNOM samo tamo gde su Borlandovi kompajleri . Kazem uglavnom zato sto postoji OpenCLX koji nisam pogledao, a i ne znam da li se moze koristiti uz neki C++ kompajler... Dakle prica o "drugim kompajlerima" kada je ovo gore navedeno u pitanju (TForm recimo, ili TObject) ne stoji...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
20.02.2005. u 19:16 

[es] :: C++ programiranje :: try/catch/finally, jel' ima dobrovoljac da isproba na drugim C++ kompajlerima

[ Pregleda: 1254 | Odgovora: 7 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.