Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
7.4 Exception Handling<br />
Wenn es im Programmverlauf zu einem ausserordentlichen Vorkommnis kommt, wird der<br />
normale Programmverlauf abgebrochen und eine Instanz der entsprechenden Exception-<br />
Klasse generiert. Man kann sich nun vorstellen, dass diese Exception gewissermassen ins<br />
Programm geworfen wird und darauf wartet, von jemandem aufgefangen zu werden. Wer<br />
ist aber der Fänger?<br />
Im Puppentheater ist es beispielsweise der Requisiteur, welcher, sobald ein Faden reisst,<br />
das Malheur beseitigt. Im Programm ist das Schlüsselwort catch der Fänger. Dem<br />
Schlüsselwort catch folgt ein geschweiftes Klammerpaar, welches statements zur<br />
Handhabung der Situation deklariert. Diese statements werden jedoch nur beim Eintritt<br />
einer Exception ausgeführt, bei „normalem“ Programmverlauf aber übersprungen.<br />
Während den Proben fürs Marionettenspiel wurde festgelegt, welche Person für welche<br />
Panne zuständig ist; es ist also der Requisiteur und nicht die Souffleuse, welcher den<br />
Nylonfaden ersetzt. Auch im Programm ist definiert, welches catch statement welche<br />
Exception behandelt: ein catch statement deklariert in runden Klammern den Exception-<br />
Typ, den es auffängt.<br />
Wenn nun ein catch statement eine eintreffende Exception nicht aufnimmt, weil es<br />
Exceptions solchen Typs nicht behandelt, wirft es die Exception wie eine „heisse<br />
Kartoffel“ zum nächsten catch statement. Falls sich dieses der Exception wiederum nicht<br />
annimmt, geht das Spiel weiter, bis die Exception schlussendlich auf ein catch statement<br />
trifft, welches die Exception auffängt.<br />
Betrachten wir die Reise einer Exception genauer: Wenn die Exception generiert wird,<br />
sucht sie zuerst im geschweiften Klammerpaar ihres Ursprungs nach einem catch<br />
statement. Ist dort keines oder kein passendes zu finden, verlässt sie dieses und geht zu<br />
demjenigen geschweiften Klammerpaar, welches das vorhergehende enthält. Auf diese<br />
Weise arbeitet sich die Exception durch die Blockstruktur einer Methode. Verlässt sie<br />
diese, siedelt sie zu demjenigen geschweiften Klammerpaar über, in welchem der<br />
Methodenaufruf stattgefunden hat. Dort arbeitet sie sich erneut durch die ganze<br />
Blockstruktur. Auf ihrer Suche nach einem catch statement durchquert eine Exception das<br />
ganze Programm, indem sie sukzessive das zuletzt ausgeführte geschweifte Klammerpaar<br />
nach einem geeignetem catch statement durchforstet und hierdurch die<br />
Anweisungsreihenfolge des Interpreters von hinten her aufrollt. Trifft eine Exception auf<br />
ihrem Weg zurück bis zur main() Methode nie auf ein erfordertes catch statement, gibt<br />
der Interpreter eine entsprechende Fehlermeldung aus.<br />
Wer wirft nun aber eine Exception? Eine Exception wird innerhalb einer Methode<br />
generiert und mit dem Schlüsselwort throw geworfen.<br />
Falls nun eine solche Methode die generierte Exception nicht behandelt, also kein<br />
entsprechendes catch statement aufweist, wirft sie die Exception weiter. Dies muss sie in<br />
ihrer Signatur mit dem Schlüsselwort throws deklarieren.<br />
191