Bei EGL können Sie entscheiden, wie sich das Programm bei Fehlern verhalten soll.
Fehlerbehandlung bedeutet, dass mögliche Arten von Problemen in einem Programm vorhergesehen werden und für jedes Problem ein Codepfad bereitgestellt wird. Falls Sie beschließen, Fehler nicht zu behandeln, bewirken praktisch selbst die trivialsten Fehler (siehe 'E/A-Fehler' weiter unten in diesem Abschnitt), dass Ihr Programm beendet wird.
Der Ausnahmedatensatz kann gegebenenfalls weitere Felder enthalten. Beispielsweise enthält der Datensatz 'IndexOutOfBoundsException' ein zusätzliches Feld namens indexValue, das den Wert des Feldgruppenindexes enthält, der von EGL nicht verarbeitet werden konnte.
onException(myEx NullValueException)
try
intArray[10] = 0; // this may not be initialized
onException(myEx NullValueException)
writeStdErr(myEx);
myErrorHandler(myEx);
end
Die Funktion myErrorHandler() könnte beispielsweise für die Initialisierung der Feldgruppe und die erneute Ausführung der Zuordnung zuständig sein.
try
get next mySerialRecord
onException(myEx AnyException)
myErrorHandler(myEx);
end
try
get next mySerialRecord
onException(myEx FileIOException)
myErrorHandler1(myEx);
onException(myEx AnyException)
myErrorHandler2(myEx);
end
Hier behandelt myErrorHandler2() alle Ausnahmebedingungen außer 'FileIOException'.
Falls EGL eine Ausnahmebedingung auslöst, die Ausnahmebedingung jedoch nicht von einem Block onException abgefangen wird, wird die Funktion sofort beendet und die Steuerung an die Funktion zurückgegeben, von der die Funktion, die den Fehler verursachte, aufgerufen wurde. Auf diese Weise übergibt EGL die Ausnahmebedingung an die übergeordneten Funktionen bis zu einer Funktion, die die Ausnahmebedingung mit einem Block onException abfängt, oder bis die Ausnahmebedingung die Hauptfunktion erreicht hat. Falls die Hauptfunktion die Ausnahmebedingung nicht abfangen kann, wird das Programm sofort beendet und das Nachrichtenfeld der Ausnahmebedingung wird in das Protokoll geschrieben. Wenn eine Ausnahmebedingung in einem über Fernzugriff aufgerufenen Programm auftritt, empfängt das aufrufende Programm statt der ursprünglichen Ausnahmebedingung eine Ausnahmebedingung des Typs 'InvocationException'. Analog liefert eine Ausnahmebedingung in einer Servicefunktion an das aufrufende Programm eine Ausnahmebedingung des Typs 'ServiceInvocationException'.
function FuncOne(myRec serialRecordType)
try
FuncTwo(myRec);
onException(myEx AnyException)
myErrorHandler2(myEx);
end
end
function FuncTwo(myRec serialRecordType)
get next myRec;
end
Im Kompatibilitätsmodus für Ausnahmebedingungen von Version 6 werden Ausnahmebedingungen nicht von Funktion zu Funktion übergeben. Dies ist nachfolgend erläutert.Wenn Sie Daten in einer Datei lesen oder schreiben, unterscheidet EGL zwischen permanenten und sporadisch auftretenden E/A-Fehlern. Die folgenden Fehler gelten als sporadisch, verursachen also wahrscheinlich keinen Datenverlust:
| Fehler | Bedeutung |
|---|---|
| duplicate | Bei einem indexierten oder relativen Datensatz gibt dieser Fehler an, dass ein zweiter Datensatz denselben Schlüssel besitzt. |
| endOfFile | Bei einem seriellen, indexierten oder relativen Datensatz gibt dieser Fehler an, dass versucht wurde, über das Dateiende hinaus zu lesen. |
| noRecordFound | Bei jedem Datensatztyp gibt dieser Fehler an, dass versucht wurde, einen Datensatz zu lesen, der nicht gefunden wurde. |
Andere Fehler wie beispielsweise ein ungültiges Dateiformat oder eine volle Datei gelten als permanente Fehler. Ein permanenter E/A-Fehler für eine indexierte, relative oder serielle Datei löst 'FileIOException' aus. Ein permanenter E/A-Fehler für eine SQL-Datenbank löst 'SQLException' aus.
while(TRUE) // endless loop
try
get next mySerialRecord;
if(mySerialRecord is endOfFile)
exit while;
end
onException(myEx AnyException)
myErrorHandler(myEx);
end
end
get myCustomer;
if(myCustomer is noRecordFound)
add myCustomer;
end
try
get myCustomer;
end
if (myCustomer is noRecordFound)
add myCustomer;
end
try
get myCustomer;
onException (myEx FileIOException)
if (myCustomer is noRecordFound)
add myCustomer;
else
myErrorHandler(myEx);
end
end
nullEx NullValueException{};
...
throw nullEx;
Record CustomerException type Exception
customerNumber INT;
end
...
throw new customerException {
customerNumber = custNum,
message = "Illegal customer number" };
Angepasste Ausnahmedatensätze wie dieser enthalten
wie die Datensätze für Systemausnahmebedingungen automatisch
die Felder messageID und message .Zur Kompatibilität mit früheren Versionen können Sie weiterhin die Fehlerbehandlungsverfahren aus Version 6 von EGL verwenden.
Sie geben den V6-Ausnahmemodus für jedes Programm separat an, wenn Sie die Eigenschaft v60ExceptionCompatibility des Programms auf YES setzen. Die besten Ergebnisse erzielen Sie jedoch, wenn Sie für alle Ihre Programme dieselbe Einstellung verwenden.
try
posNum = abs(myVar);
onException
if(sysVar.errorCode = "00000008") // invalid input
myErrorHandler1();
if(sysVar.errorCode = "00000012") // cannot assign value
myErrorHandler2();
else
myErrorHandler3();
end
vgVar.handleSysLibraryErrors = 1;
posNum = abs(myVar);
if(sysVar.errorCode == "00000008") // invalid input
myErrorHandler1();
else
if(sysVar.errorCode == "00000012") // cannot assign
myErrorHandler2();
else
exit program (-1);
end
end
Wenn für vgVar.handleSysLibraryErrors jedoch 0 (Standardeinstellung) festgelegt ist und Sie keinen Try-Block zum Abfangen von Ausnahmebedingungen verwenden, führt jede Ausnahmebedingung zur Beendigung des Programms.
Weitere Informationen hierzu finden Sie in Ausnahmebedingungsbehandlung.