Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erhält CGO Try-and-Catch-Ausnahmen, wenn die dynamische C++-SO-Bibliothek im GO-Sprachprozess aufgerufen wird?

Wie erhält CGO Try-and-Catch-Ausnahmen, wenn die dynamische C++-SO-Bibliothek im GO-Sprachprozess aufgerufen wird?

WBOY
WBOYnach vorne
2024-02-11 15:20:09502Durchsuche

Wie erhält CGO Try-and-Catch-Ausnahmen, wenn die dynamische C++-SO-Bibliothek im GO-Sprachprozess aufgerufen wird?

php-Editor Yu Zai Wenn Sie in der GO-Sprachentwicklung versuchen möchten, Ausnahmen abzufangen, wenn CGO die dynamische C++-SO-Bibliothek aufruft, können Sie einige Methoden verwenden. Erstens können Sie die Funktionen setjmp und longjmp im C++-Code verwenden, um Ausnahmen abzufangen und auszulösen. Verwenden Sie dann die CGO-Importanweisung „C“ im GO-Code, um die C++-Funktion zu importieren und aufzurufen. Als Nächstes verwenden Sie die Funktionen „defer“ und „recover“ im GO-Code, um die im C++-Code ausgelösten Ausnahmen zu erfassen und zu behandeln. Durch diese Methoden können Try-and-Catch-Ausnahmen abgerufen werden, wenn die dynamische C++-SO-Bibliothek im GO-Sprachprozess aufgerufen wird.

Frageninhalt

Ich schreibe ein Go-Programm, in dem ich cgo verwende, um eine in C++ geschriebene dynamische Bibliothek (`.so) aufzurufen, die das Kommunikationsprotokoll verwaltet. Der Code in dieser C++-Bibliothek kann Ausnahmen auslösen, daher verwende ich try-catch, um Ausnahmen im Bibliothekscode abzufangen, und verzögere das Abfangen dieser Ausnahmen im Go-Code, wenn ich die C++-Funktionen der Bibliothek aufrufe.

Aber es stellt sich heraus, dass der Go-Code die Ausnahme nicht abfangen kann, wenn C++ versucht, die Ausnahme abzufangen.

Meine Frage ist, wie man eine C++-Ausnahme in Go-Code abfängt, die durch einen cgoAufruf einer C++-Funktion ausgelöst wird.

Workaround

Es gibt keine Möglichkeit, dies direkt zu tun.

Erstellen Sie einen C/C++-Wrapper (Sie können ihn „inline“ in den Go-Quellcode in den mit cgo 相关的“注释”中),该包装器将调用目标 C++ 函数,但会将调用包装在 try/catch 块中,捕获所有内容(std::exception verknüpften „Kommentar“ schreiben), der die C++-Zielfunktion aufruft, den Aufruf jedoch in try einschließt /catch-Block, fängt alles ab (std::Exception) und konvertiert alle abgefangenen Ausnahmen in spezielle Werte, die vom Aufruf zurückgegeben werden.

Ich habe eine gute Erklärung a> dafür gefunden, wie das geht, mit Beispielen.

Das obige ist der detaillierte Inhalt vonWie erhält CGO Try-and-Catch-Ausnahmen, wenn die dynamische C++-SO-Bibliothek im GO-Sprachprozess aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen