A VIRT programozási nyelv

Kivételkezelés

Szintaxis

Try_except_statement = try { Statement } except ( { Statement } | On_do_Block ) end

Van amikor szeretné tudni a programozó, hogy egy bizonyos mûvelet végrehajtódott-e, kiváltódott-e kivétel vagy sem. Ebben az esetben használható a try...finally utasítás.

Try_finally_statement = try StatementList1 finally StatementList2 end StatementList1 = { Statement } StatementList2 = { Statement }

Amikor try...finally blokkban lévõ utasítások végrehajtása kivételdobás nélkül fejezõdik be, akkor végrehajtódnak a finally...end blokkban lévõ utasítások. Ha kiváltódik kivétel, akkor a vezérlés a StatementList2-re adódik át, ennek a végrehajtása után a kivétel újra kiváltódik. Ha nem kezeljük le a kivételt, akkor az továbbadódik a try...finally blokkon kívülre.

CoInitialize() try object Basic( 'Word.Basic' ), Insert : Dispatch Dummy := Basic/Insert[ 'VIRT says hello!' ] finally CoUninitialize() Writeln( 'COM closed' ) end

Kivételek definiálása

Bármely objektum lehet kivétel. A standard kivétel osztály specifikációját a a System module tartalmazza.

--Alaposztály class Exception function Create() constructor function Show() end --Nemdefiniált változó class EUndefError : Exception end -- Unáris operátor hiányzik class EUnary : Exception end -- Konverziós operátor hiányzik class EConversion : Exception end -- Bináris operátor hiányzik class EBinary : Exception end -- Hibás típusillesztés class ETypeMismatch : Exception end -- Helytelen függvényhívás class EFunctionCall : Exception end -- Nullával való osztás class EDivByZero : Exception end

Kivételek kiváltása

Szintaxis
Raise_statement = raise [ Expression ]

Kivétel kiváltása: raise kulcsszó, amit egy kivételosztály egy példánya követ.

Példa
A := [ 'ab', 15, *, 8.2 ] try for I:=1 to Card( A ) do if Null( A[ I ] ) then raise Break end end except end

Ha nem írunk semmit a raise után, akkor az aktuális kivételt hívja meg újra.

try K := I / J except on EDivByZero do ShowMessage( 'Division by zero !' ) raise -- raise EdivByZero again end end

Kivételek kezelése

Az On_do_Block-ban kezelhetjük le, ha a try ...except parancsok közötti utasítások végrehajtása közben kivételes esemény történik. Ha az On_do_Block-ban illeszkedik egy kezelõ a kiváltódott kivételre, akkor oda adódik át a vezérlés. Az illeszkedés azt jelenti, hogy azonosak, vagy a kezelõosztály õse a kivételnek. Ha nincs megfelelõ kivételkezelõ, akkor a vezérlés az else ágra adódik.

On_do_Block = on [ Object_name ":" ] Class_name do { Statement } { on [ Object_name ":" ] Class_name do { Statement } } [ else { Statement } ] end
Példa
try P := Q[ I ] except on ERangeError do HandleRangeError() on ETypeMismatch do HandleTypeMismatch( P, Q ) end end