Oxygene

Kivételkezelés



Szintaxis

A kivétel kezelésésre három különböző szerkezetet használhatunk ebben a programozási nyelvben.

Például:

try <code lines> except <your exception code> finally <your cleanup code> end;

Kivételek definiálása

Van lehetőség saját kivételek definiálására is, mégpedig úgy, hogy a kivétel osztályt a System.Exceptionvagy belőle származtatott ősosztályból kell származtatni, sőt érdemes olyan System.Exception -ból származtatott .NET-es osztályt választani, ami legjobban megközelíti az új kivétellel jelzett problémát.

Kivételek kiváltása

Lehetőség van kivétel kiváltására is a "raise" kulcsszóval. Lehet a nyelvbe beépített kivételt kiváltani, vagy akár saját kivételt is.

if MyObject = nil then raise new Exception('MyObject not initialized');

Kivételek kezelése

A try blokkban fellépő kivételeket az except blokkban lehet lekezelni. Csak az olyan típusú kivételek lesznek lekezelve, amire írtunk külön lekezelő részt, azonban az Exception típussal az összes kivételt le lehet kezelni. A finally blokkban lévő utasítások mindenképpen végrehajtódnak, attól függetlenül, hogy volt e kivétel a try blokkban vagy sem. Példa:

method TTestForm.OnClick(Sender: Object; ea: EventArgs); begin try fClickCount := fClickCount+1; //fNull.ToString(); //Divide(0); except on E:Exception do begin MessageBox.Show('Found an error: '+E.Message); end; finally fEdit.Text := fClickCount.ToString; end; end;

Azon kívül, hogy a kivétel típusa szerint szűrhetjük a lekezelendő kivételeket, doxygen arra is ad lehetőséget, hogy egy bizonyos kivételtípus csak adott rá vonatkozó feltétel mellett le legyen kezelve. Ezt where kulcsszóval érhetjük el. Pl.:

try // ...code goes here... except on E: SocketException where E.ErrorCode = 10054 do begin // connection was closed gracefully end; end;

Ha kivételkezelés közben mégis úgy döntünk, hogy ezen a szinten nem tudjuk lekezelni a kivételt, akkor „továbbküldhetjük” a következő kezelési, ehhez újra ki kell váltani a már lekezelt kivételt. Ez raise kulcsszóval oldható meg. Ha except blokkban vagyunk, akkor raise kulcsszó paraméterek nélkül az éppen kezelt kivételt váltja ki újra.

Kivételek terjedése

Ha a kivétel nincs lekezelve az aktuális blokkban akkor tovább terjed az őt tartalmazó blokkra, ha ott sincs lekezelve, akkor szintén tovább terjed az őt tartalmazó blokkra és így tovább egészen addig amíg a main függvényhez nem érünk, ha itt sincs lekezelve a kivétel akkor a program leáll.