0 Tage Serie
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
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.