Das Werfen ist mit dem Operationscode "throw" denkbar einfach. Als Operand wird ein PMC vom Basistyp "Exception" erwartet.
$ cat exception.pir
.sub main
$P0 = new 'Exception'
$P0['_message'] = "41 ist falsch"
throw $P0
.end
$ parrot exception.pir
41 ist falsch
current instr.: 'main' pc 7 (exception.pir:4)
Um eine Exception zu fangen, muss ein Exception-Handler angegeben werden. Es ist möglich über einen Stack mehrere Exception-Handler zu verschachteln. Eine auftretende Exception wird immer vom obersten Handler gefangen und verarbeitet.
Mit "push_eh" kann ein Exception-Handler auf den Stack gelegt werden. "pop_eh" entfernt den obersten Handler. Im Falle einer Exception wird die Handler-Sprungmarke mit 2 Argumenten angesprungen. Die Exception und die Fehlernachricht.
$ cat exception2.pir
.sub main
push_eh handler
$P0 = new 'Exception'
$P0['_message'] = '41 ist falsch'
throw $P0
pop_eh()
exit 0
handler:
.local pmc exception
.local string message
.get_results (exception, message)
$S0 = 'Exception gefangen: ' . message
$S0 = $S0 . "\n"
print $S0
exit 1
.end
$ parrot exception2.pir
Exception gefangen: 41 ist falsch
Erstellt von Johannes Barop