Interrupts
ARexx unterhält ein internes Interrupt-System zum Erkennen
und Abfangen bestimmter Fehlerbedingungen. Wird ein Interrupt aktiviert und seine entsprechende Bedingung tritt
ein, kommt es zur Übertragung der Steuerung an die dieser Unterbrechung zugehörige Sprungmarke. Auf diese
Weise kann ein Programm die Steuerung behalten, obwohl die vorliegenden Bedingungen normalerweise zum Abbruch des
Programms führen würden. Die Interrupt-Bedingungen können durch synchrone Ereignisse (z.B. Syntaxfehler)
oder asynchrone Ereignisse z.B. Unterbrechungsanforderungen über die Tastatureingabe Ctrl-C) ausgelöst
werden.
|
Hinweis:
|
Solche internen Interrupts haben nichts mit dem Hardware-Interrupt-System
zu tun, was vom Betriebssystem EXEC verwaltet wird.
|
Der jedem Interrupt zugeordnete Name ist jeweils die Sprungmarke,
an die die Steuerung übergeben wird. Damit überträgt ein Interrupt SYNTAX die Steuerung also an
die Sprungmarke "SYNTAX:". Interrupts können mit dem Befehl SIGNAL aktiviert oder inaktiviert werden.
Der Befehl "SIGNAL ON SYNTAX" aktiviert z.B. den Interrupt SYNTAX.
Die von ARexx unterstützten Interrupts sind:
|
BREAK_C
|
Fängt eine von AmigaDOS generierte Unterbrechungsanforderung
Ctrl-C ab (d.h. sie wird entdeckt und als Signal interpretiert, aber nicht als normale Eingabe). Ist der Interrupt
nicht aktiviert, bricht das Programm sofort ab, gibt die Fehlermeldung "Execution halted" (Ausführung
abgebrochen) aus und gibt den Fehlercode 2 zurück.
|
|
BREAK_D
|
Fängt eine von AmigaDOS generierte Unterbrechungsanforderung
Ctrl-D ab. Ist der Interrupt nicht aktiviert, wird die Unterbrechungsanforderung ignoriert.
|
|
BREAK_E
|
Fängt eine von AmigaDOS generierte Unterbrechungsanforderung
Ctrl-E ab. Ist der Interrupt nicht aktiviert, wird die Unterbrechungsanforderung ignoriert.
|
|
BREAK_F
|
Fängt eine von AmigaDOS generierte Unterbrechungsanforderung
Ctrl-F ab. Ist der Interrupt nicht aktiviert, wird die Unterbrechungsanforderung ignoriert.
|
|
ERROR
|
Dieser Interrupt wird von jedem Host-Kommando generiert,
das einen von Null abweichenden Fehlercode zurückgibt.
|
|
HALT
|
Ist dieser Interrupt aktiviert, wird eine externe Unterbrechungsanforderung
abgefangen. Andernfalls bricht das Programm sofort ab und gibt die Fehlermeldung "Execution halted" (Ausführung
abgebrochen) aus.
|
|
IOERR
|
Ist dieser Interrupt aktiviert, werden vom E/A-System entdeckte
Fehler abgefangen.
|
|
NOVALUE
|
Ist diese Bedingung aktiviert, kommt es zu einem Interrupt,
wenn eine nicht initialisierte Variable verwendet wird. Die Auslösung dieses Interrupts kann innerhalb eines
Ausdrucks, im Befehl UPPER oder in der integrierten Funktion VALUE() erfolgt sein.
|
|
SYNTAX
|
Dieser Interrupt generiert einen Syntax- oder Ausführungsfehler.
Nicht alle Fehler dieser Art können abgefangen werden. Manche Fehler treten vor der Ausführung eines
Programms auf. Diejenigen, die von der externen ARexx-Schnittstelle entdeckt werden, können vom Interrupt
SYNTAX nicht abgefangen werden.
|
Wenn ein Interrupt zwangsläufig einen Steuerungstransfer
("Sprung") herbeiführt, werden alle zur Zeit aktiven Steuerungsbereiche inaktiviert. Der Interrupt,
der die Steuerungsübertragung auslöste, wird inaktiviert. Dies verhindert die Entstehung einer rekursiven
Interrupt-Schleife. Betroffen sind allerdings nur die Steuerungsstrukturen der aktuellen Umgebung. Ein innerhalb
einer Funktion generierter Interrupt hat also keine Auswirkungen auf die Umgebung der Aufrufebene.
Das Auftreten einer Interrupts wirkt sich auf zwei Sondervariablen
aus:
|
SIGL
|
Ist stets auf die aktuelle Zeilennummer gesetzt, bevor es
zum Steuerungstransfer kommt. Damit kann festgestellt werden, welche Zeile des Quelltextes ausgeführt wurde.
|
|
RC
|
Ist auf den Fehlercode gesetzt, der die Bedingung auslöste.
Bei ERROR-Interrupts ist dieser Wert der Rückgabewert eine Kommandos und kann normalerweise als Einstufung
des Fehlerschweregrades interpretiert werden. Der Wert des SYNTAX-Interrupts ist stets ein ARexx-Fehlercode.
|
Interrupts sind sehr nützlich bei der Fehlerbehebung. Dazu
gehört die Information externer Programme über das Auftreten eines Fehlers oder das Melden weiterer Diagnosedaten
zur Eingrenzung des Problems. Beispielprogramm 15 zeigt, wie bei Feststellung eines Syntaxfehlers ein Kommando
"message" an den externen Host ausgegeben wird.
Programm 15. Interrupt-rexx
/*Ein Makro-Programm für
"MeinEdit'*/
SIGNAL ON SYNTAX /*Interrupt aktivieren*/
(normale Verarbeitungsbefehle)
EXIT
SYNTAX: /*Syntaxfehler entdeckt*/
ADDRESS `MeinEdit'
`message' `error' RC errortext (RC)
EXIT 10