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