Heute möchte ich dir zeigen, wie ich persönlich das Error-Handling in meinen Scripten verwenden. Vielleicht ist es eine etwas „russische Art“ aber sie funktioniert für ausreichend gut und ist nicht zu kompliziert.
Wozu benötige ich das Error-Handling?
Unter Bash ist es meist sehr schwierig einen Abbruch direkt nach dem Ausführen eines Befehls festzustellen. Klar, man könnte alles was auf STDERR läuft auswerten…trotzdem benötigt man nach jedem Aufruf eines Kommandos eine Abfrage auf den Errorcode mit entsprechendem Error-Handling.
So, wie löse ich nun mein Error-Handling?
Zu erst das Script und anschließend die Erklärung warum ich genau diesen Weg gegangen bin
func_error.sh
#!/bin/bash set +x ######################################################################## # # # Functionname: func_error() # # # # Parameter: # # 1 - Returncode vom zu pruefenden Befehl # # 2 - Beschreibung fuer Abbruchmeldung # # # # - prueft vorherigen Befehl auf Errorcode ungleich 0 # # # ######################################################################## func_error() { set +x local _errorcode="" local _desc="" local _ts=$(date "+%Y-%m-%d %H:%M:%S") local _job=${0##*/} if [ "${_errorcode}" != "0" ];then echo "<ERROR> ${_ts} - ${_job}: ${_desc} | <RETURNCODE> ${_errorcode}" | tee -a ${ERRORLOG} exit ${_errorcode} fi }Wie du siehst habe ich eine Funktion erstellt, welche nach dem Aufruf eines Kommandos eingebunden wird und den jeweiligen Errorcode auswertet.
Eine kurze Erklärung zu meinen eigenen Vereinbarungen, welche ich bei Funktionen verwende:
Variablen, welche ausschließlich innerhalb der Funktion verwendet werden, werden als lokale Variablen deklariert/initialisiert.
Ebenfalls bekommen alle lokalen Variablen das Präfix _ „Unterstrich“.local _lokaleVar="abc"Außerdem haben alle meine Funktionen, wenn sie einen Wert zurückgeben den Variablennamen ${result} (s. andere Scripte).
Aufruf der func_error aus einem Script:
echo "Hallo" func_error "${?}" "Befehl fehlerhaft gewesen"Sollte nun der vorherige Befehl auf Returncode 0 laufen, so überspringt er die func_error. Sollte ein anderer Returncode als 0 kommen (z.B. 1) so springt er in die If-Abfrage, baut sich einen Errorstring aus dem eindeutigen Präfix „“, dem aktuellen Timestamp im Aufbau Datum + Uhrzeit, dem Scriptname, aus welchem die Funktion func_error aufgerufen wurde, der übergebenen Beschreibung des Fehlers und des Returncodes zusammen und gibt diesen in einer separaten Log-Datei aus. Der Job wird mit dem zuletzt verwendeten Errorcode beendet.
Natürlich gibt es noch tausend andere Wege ein Errorhandling zu entwickeln. Es kommt dabei aber immer auf den jeweiligen Anwendungszweck drauf an und in meinem Fall reicht mir diese Art vollkommen aus.
Das Funktion gibt es selbstverständlich auch als DOWNLOAD.