Was sind einige „gute“ Möglichkeiten / setjmp verwenden longjmp für C Fehlerbehandlung?

StackOverflow https://stackoverflow.com/questions/819864

Frage

Ich habe C für ein Projekt zu verwenden, und ich denke longjmp/setjmp für Fehler mit Handling, wie ich denke, wird es viel einfacher sein, Fehler zu behandeln an einem zentralen Ort als Returncodes. Ich würde schätzen, wenn es einige Leitungen, wie dies zu tun.

Ich bin besonders mit Bereinigungs Ressource korrekt, wenn ein solcher Fehler auftritt getan.

Auch, wie ich Fehler gehe, die sie in Multi-Threaded-Programme führen mit?

Noch besser ist es eine C-Bibliothek, die für Fehler / Ausnahmebehandlung ist bereits vorhanden?

War es hilfreich?

Lösung

Haben Sie einen Blick auf dieses Beispiel / Tutorial:
http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch .html

Andere Tipps

Wenn Sie sich Sorgen über die Ressourcenbereinigung sind, müssen Sie sich ernsthaft fragen, ob longjmp () und setjmp () ist eine gute Idee.

Wenn Sie Ihr Ressourcenzuweisungssystem so auszugestalten, dass Sie in der Tat genau bereinigen kann, dann ist es in Ordnung - aber das Design neigt dazu, schwierig zu sein, und in der Regel unvollständig, wenn in der Tat, die Standard-Bibliotheken, die Ihr Code verwendet selbst zuteilen Ressourcen, die freigegeben werden müssen. Es erfordert außerordentliche Sorgfalt, und weil es nicht ganz zuverlässig ist, ist es nicht geeignet für langlaufende Systeme, die mehrere Verwendungen des setjmp () / longjmp () aufruft (sie werden auslaufen, erweitern, und schließlich Ursache überleben könnte müssen Probleme).

Symbian implementiert es Leave Mechanismus in Bezug auf longjmp() ist und dies dient als guten Spaziergang durch alle Dinge, die Sie tun müssen.

Symbian hat einen globalen ‚Bereinigungsstapel‘, die Sie drücken und Pop-Dinge, die Sie wollen aufgeräumt sollte ein Sprung passiert ist. Dies ist die manuelle Alternative zum automatischen Stapel Abwickeln, dass ein C ++ Compiler tut, wenn eine C ++ Ausnahme ausgelöst wird.

Symbian hatte ‚Trap Geschirre‘, dass es springen würde; diese verschachtelt werden.

(Symbian jüngerer Zeit neu implementiert es in Bezug auf die C ++ Ausnahmen, aber die Schnittstelle bleibt unverändert).

Insgesamt denke ich, dass die richtigen C ++ Ausnahmen Codierungsfehler weniger anfällig sind und viel schneller als Ihre eigene C äquivalenten Fahrzeuge.

(modern C ++ Compiler sind sehr gut im ‚Null-Overhead‘ Ausnahmen, wenn sie nicht geworfen werden, zum Beispiel, longjmp() hat den Zustand aller Register zu speichern und so auch wenn der Sprung später nicht in Anspruch genommen, so kann im Grunde nie sein, so schnell wie Ausnahmen.)

C ++ als besser C, wo man nur Ausnahmen annehmen und RAII, wäre eine gute Strecke sein sollte für die Ausnahme Emulation seine verlockend Sie mit longjmp().

Ich habe immer nur gefunden ein Einsatz für setjmp()/longjmp() und es war nicht mit Fehlerbehandlung zu tun.

Es gibt wirklich keine Notwendigkeit, es zu benutzen, für dass, da es immer in etwas Refactoring werden kann leichter zu folgen. Die Verwendung von setjmp()/longjmp() ist sehr ähnlich, um goto, dass es leicht missbraucht werden kann. Alles, was Ihr Code weniger lesbar macht, ist eine schlechte Idee, im Allgemeinen. Beachten Sie, dass ich sage nicht, sie sind von Natur aus schlecht, nur, dass sie zu schlechten Code leichter als die Alternativen führen können.

FWIW, die einen Ort, den sie von unschätzbarem Wert waren, war ein Projekt, das ich in den frühen Tagen der Industrie hat (MS-DOS 6 Zeitrahmen). Ich schaffte es gemeinsam eine kooperative C Multi-Threading-Bibliothek Turbo setzen, die diese Funktionen in einer yield() Funktion Aufgaben zu wechseln.

Ich bin ziemlich sicher, ich habe sie nicht berührt (oder hatte die Notwendigkeit) seit jenen Tagen.

Ausnahmen sind bei weitem besseren allgemeinen Mechanismus, aber in den tiefen, dunklen Tage von C Vergangenheit, schrieb ich einen Prozessor-Emulator, der eine Kommando-Shell enthalten. Die Schale verwendet / longjmp für Interrupt setjmp Handhabung (dh der Prozessor läuft und die User Zugriffe brechen / Ctrl-C, den Code-Traps SIGINT und longjmps an der Schale zurück).

Ich habe einigermaßen ordentlich setjmp / longjmp verwendet wird, aus einem Rückruf zu entkommen, ohne dass mein Weg durch verschiedene andere Bibliotheken Ebene verhandeln.

Dieser Fall (wenn ich mich richtig erinnere) war, wo ein Code innerhalb eines yacc generierte Parser könnte ein (nicht-syntaktisches) Problem erkennen und wollte den Parsing verlassen, aber einen einigermaßen nützlichen Fehlerbericht zurück an die Anrufer auf die geben andere Seite aller yacc-generierten Code. Ein anderes Beispiel war in einem Rückruf von einem Expat-Parser bezeichnet. In jedem Fall waren es andere Möglichkeiten, dies zu tun, aber sie schienen umständlich und dunkel, als nur auf diese Weise der Rettung.

Wie andere Antworten darauf hingewiesen haben, ist es allerdings notwendig, vorsichtig clean-up zu sein, und sehr nachdenklich darum, sicherzustellen, dass der longjmp Code nur im Rahmen der Region aufrufbar ist dynamisch vom setjmp geschützt.

Handelt es im Rahmen der Multi-Thread-Programmierung? Ich bin sicher, das ist nicht unmöglich, aber Oooh: Holen Sie Ihre Familie-Packung von Aspirin jetzt. Es ist wahrscheinlich ratsam, die setjmp / longjmp Paare so nahe beieinander wie möglich zu halten. Solange ein passender setjmp / longjmp Paar im selben Thread sind, erwarte ich Sie in Ordnung sein wird, aber ... da draußen vorsichtig sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top