2017-05-28 3 views
0

Ich möchte, dass mein ksh-Skript bei einem unerwarteten Fehler beendet wird. Ich benutze auch Funktionen, die ich verschachtle, um wiederkehrenden Code wiederzuverwenden.Verschachteln der Ausnahmebehandlung in ksh (set -e)

Also verwende ich Errexit-Funktion ('set -e'). Das Skript stürzt bei einem Fehler ab -> great.

Ich möchte irgendwann den Fehler abfangen anstatt abstürzen.

Ich habe eine Funktion func. Ich möchte, dass (Anforderungen):

  • in der Funktion: es

  • in der übergeordneten auf Fehler stoppen sollte: es auch

  • der Ausnahme, dass in der übergeordneten, Fehler auf Fehler sollten aufhören

    : wenn 'Funktion' Ausführen sollte

ich diese codiert gefangen werden 0

# parent script 

func() 
    { (
    set -e # function should crash on 1st error 
    rm foo ; rm foo # this will trigger error 
    echo "Since -e is set, this part of the script should never get reached" 
) } 


set -e # parent script should crash on 1st error 

echo "do stuff" 

# we want to execute 'function' and catch error 
if func ; then 
    echo "Execution of func was ok" 
else 
    echo "Execution of func was not ok" 
fi 

echo "do more stuff" 

Es funktioniert nicht.

Da 'func' innerhalb eines Tests ausgeführt wird (wenn func), ist der Errexit deaktiviert. Dies bedeutet, dass Fehler innerhalb der Funktion die Funktion nicht zum Absturz bringen. Die Funktion wird fortgesetzt und mit Status 0 beendet, und das übergeordnete Element wird nicht über den Fehler benachrichtigt. Selbst wenn ich innerhalb der Funktion func explizit wieder errexit einstelle, ist der Errexit nicht aktiviert.

Wenn ich func in einem Test nicht ausführe, tritt der Errexit ein und der Elternteil stürzt ab: Ich kann die Ausnahme nicht abfangen (mit anderen Worten: Ich bin funciert). Ich könnte Errexit um den Aufruf von Func vorübergehend deaktivieren, aber es scheint wie ein unsauberer Workaround.

Irgendeine Idee, wie ich meine Anforderungen erreichen könnte?

Antwort

0

Haben Sie versucht, eine Suche nach "set -e" (inklusive Anführungszeichen) auszuführen?

Oder vielleicht eine Google-Suche, zB: KSH "set -e" site: stackoverflow.com

... mehr Hits/Streichhölzer/proposed-Antworten.

+0

Markp Sie sind richtig. Ich habe nicht lange genug in stackoverflow.com gesucht, bevor ich posten konnte. Es tut uns leid. Dieser scheint meine Frage richtig zu behandeln: https://stackoverflow.com/questions/4072984/set-e-in-a-function – Bapt