2010-12-19 2 views
4

Ich schreibe eine C++ - Bibliothek, die eine externe C-Bibliothek von Drittanbietern verwendet. Also wird meine Bibliothek Funktionen in dieser Third-Party-Bibliothek aufrufen und die Third-Party-Bibliothek wird in einen anderen Teil meiner Bibliothek zurückrufen.Ausnahmeausbreitung in extern verknüpften C-Bibliotheken

Ich frage mich, was in diesem Fall zu Ausnahmen geschieht? Say MyLib :: foo() ruft externe C-Bibliothek-Funktion, die schließlich ruft MyLib :: bar(), und Balken löst eine Ausnahme, was passiert? Wird die Ausnahme in foo() korrekt an einen Handler weitergegeben?

Danke!

Antwort

6

Wird die Ausnahme in foo() korrekt an einen Handler weitergegeben?

Ich denke, ob Ausnahmen durch externe C-Code propagieren ist undefiniert. Was noch schlimmer ist, der C-Code ist unvorbereitet und kann die Ausnahme nicht verarbeiten. C-Code muss nicht gegen plötzliche, unerwartete Rücksendungen immun sein, so dass er keine RAII usw. kennt.

Als ich einmal mit einer solchen Situation konfrontiert wurde, fing ich die Ausnahme auf, bevor ich zur C API zurückkehrte, sie speicherte und warf es erneut, sobald der Aufruf von der C-API kam.

+2

Das ist besser als meine Antwort. Ich habe nicht gesehen, dass die Third-Party-Bibliothek C und nicht C++ war. Obwohl der Fragesteller das mehrmals erwähnt. Schlafenszeit, vielleicht. –

+0

Dies ist die richtige Antwort. Während einige Implementierungen (GNU) sich sehr bemühen, Ausnahmen zu erlauben, sich über C-Code zu verbreiten, ist es eine sehr, sehr schlechte Idee, dies zu nutzen. Es ist nicht nur nicht portierbar, es gibt auch keinen Grund anzunehmen, dass der C-Code dazwischen keinen inkonsistenten Zustand hat oder Speicherzuweisungen enthält, die noch nicht extern aufgezeichnet oder freigegeben wurden. Im besten Fall fragt man nach Speicherlecks und im schlimmsten Fall nach zufälligen Abstürzen. Ich mag den Vorschlag von sbi, das Problem zu umgehen, aber es ist wahrscheinlich am besten, Ausnahmen über Modulgrenzen hinweg zu vermeiden. –

+1

@Tommy: Ich habe eine langwierige Erklärung geschrieben, warum Ausnahmen durch eine C-Lib propagieren, ist schlecht als Kommentar zu Ihrer Antwort und wurde mürrisch, als Sie es bereits gelöscht hatten, als ich den Kommentar committen wollte. Also danke für deinen netten Kommentar, der das wieder wettgemacht hat. ':)' – sbi

1

Es ist eine schwere Plattform Implementierung Detail. Im Allgemeinen ist es wahrscheinlich, dass die Ausnahmeverrohrung den Stapel durch C-Funktionsaktivierungsrahmen abwickeln kann. Notwendig, weil die CRT oft in C geschrieben wird. Der C-Code ist jedoch ziemlich unwahrscheinlich glücklich darüber, der Staat wurde mutiert, der nicht wiederhergestellt werden kann.

Für den Fall, das ist Windows wird der C-Code, um einen Schuss auf ihn haben. C++ - Ausnahmen werden auf die in Windows integrierte allgemeine Ausnahmebedingung namens Structured Exception Handling (SEH) angewendet. Mit den Schlüsselwörtern __try und __except rufen Sie einen Ausnahmefilter auf, der den C-Code-Status wiederherstellen kann. Offensichtlich ist das nicht tragbar.

nie eine Implementierung Detail Frage stellen, ohne die Details der Implementierung zu erwähnen, bitte.