c / expert
Snippet
Nicht-lokale Sprünge zur Fehlerbehandlung
setjmp und longjmp ermöglichen nicht-lokale Sprünge, die den standardmäßigen Funktionsaufruf- und Rückgabemechanismus umgehen. Dies wird häufig verwendet, um eine Ausnahme-ähnliche Fehlerbehebung zu implementieren, bei der eine tief verschachtelte Funktion direkt zu einem Error-Handler weiter oben im Call-Stack zurückkehren kann.
snippet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>#include <setjmp.h>jmp_buf recovery_env;void risky_operation(int val) {if (val < 0) longjmp(recovery_env, 1);printf("Operation successful: %d\n", val);}int main() {if (setjmp(recovery_env) == 0) {risky_operation(-5);} else {printf("Error caught: Value cannot be negative.\n");}return 0;}
Erklärung
1
jmp_buf recovery_env;
Deklariert einen Puffer zum Speichern der Ausführungsumgebung (Stack-Pointer, Instruction-Pointer usw.).
2
if (setjmp(recovery_env) == 0)
Speichert die aktuelle Umgebung; gibt beim ersten Aufruf 0 zurück und einen Wert ungleich 0 bei Rückkehr via longjmp.
3
longjmp(recovery_env, 1);
Stellt die im Puffer gespeicherte Umgebung wieder her und springt effektiv zum setjmp-Aufrufpunkt zurück.