Parrot

Eine VM für mehrere Skriptsprachen

Exceptions

Werfen von Exceptions

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)

Fangen von Exceptions

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