Exceptions in C++-Code, der aus C-Code aufgerufen wird
-
Hallo,
ist es richtig, dass das Verhalten undefiniert ist, wenn ich in einer C++-Funktion, die von externem C-Code (aus einer Library) als Callback aufgerufen wird, eine Exception werfe (bzw. von der STL eine geworfen wird)?
Wäre es dann eine gute Lösung, in der Callback-Funktion alle Exceptions folgendermaßen zu fangen?
try { // eigentlicher Code } catch (...) { assert(0); //es dürfen keine Exceptions nach "draußen" gelangen }
Sven
-
Ein assert bringt dein Programm zum absterben, das kann doch nicht grundsätzlich die Reaktion auf Exceptions sein.
Du musst die Schnittstelle für C so darstellen, dass du bei Fehlern einen Fehlerwert zurücklieferst.
btw. finde ich assert(int) unglücklich. bool ist ein eigener Datentyp und das ist gut so. Unglücklicherweise wird int aus Kompatibilitätsgründen implizit umgewandelt, aber bewusst ausnutzen sollte man das nicht auch noch.
-
Nachdem assert() aber eine C-Funktion ist und es dort kein bool gibt, finde ich das sehr ok.
Unter Windows ist es (zumindest bei VC++-Compilaten) möglich, Exceptions durch C-Funktionen hindurch zu werfen (wegen SEH). Allerdings musst du bedenken, dass die C-Funktion nicht damit rechnet, dass eine Funktion nicht zurückkehrt, da können unschöne Leaks zustandekommen.
-
Ringding schrieb:
Nachdem assert() aber eine C-Funktion ist und es dort kein bool gibt, finde ich das sehr ok.
Nö. Nö.
Allerdings musst du bedenken, dass die C-Funktion nicht damit rechnet, dass eine Funktion nicht zurückkehrt, da können unschöne Leaks zustandekommen.
Was auf deutsch heißt: es geht nicht.
-
Shade Of Mine schrieb:
Was auf deutsch heißt: es geht nicht.
Wenn du die C-Funktion selber gemacht hast, erzeugst du damit zumindest kein undefiniertes Verhalten...
Aber in der Regel sollte man wohl eher davon Abstand nehmen.
-
Ringding schrieb:
Nachdem assert() aber eine C-Funktion ist und es dort kein bool gibt, finde ich das sehr ok.
In C gibt es auch ein bool, das nennt sich allerdings _Bool. Mit Hilfe der stdbool.h wird das dann so gemappt, dass du wie in C++ bool verwenden kannst.
-
Hallo,
also von mir ist die C-Funktion nicht, ich programmmiere lieber in C++
In diesem Fall handelt es sich um eine Callback-Funktion, die von SQLite aufgerufen wird. Nun kann es ja passieren, dass in der Funktion eine Exception fliegt, entweder durch die STL oder durch eine andere Funktion, die von der Callback-Funktion benutzt wird. Daher kann ich das Werfen einer Exception hier nicht verhindern. Da die Signatur der Callback-Funktion aber ebenfalls feststeht, kann ich auch nicht einfach einen Fehlerwert zurückgeben, da das von der Library nicht vorgesehen ist.
Deshalb bin ich auf die Idee mit assert(false) gekommen. Gibt es denn eine bessere Lösung für das Problem?
@Optimizer: Das mit assert(0) sehe ich ein. Ich habe das mal irgendwo gesehen und anscheinend hat sich das dann ohne Nachdenken festgesetzt...
Sven