Maison  >  Article  >  développement back-end  >  Comment CGO obtient-il des exceptions d'essai et d'interception lors de l'appel de la bibliothèque SO dynamique C++ dans le processus du langage GO ?

Comment CGO obtient-il des exceptions d'essai et d'interception lors de l'appel de la bibliothèque SO dynamique C++ dans le processus du langage GO ?

WBOY
WBOYavant
2024-02-11 15:20:09502parcourir

Comment CGO obtient-il des exceptions dessai et dinterception lors de lappel de la bibliothèque SO dynamique C++ dans le processus du langage GO ?

php Editor Yu Zai Dans le développement du langage GO, si vous souhaitez essayer d'attraper des exceptions lorsque CGO appelle la bibliothèque SO dynamique C++, vous pouvez utiliser certaines méthodes. Tout d’abord, vous pouvez utiliser les fonctions setjmp et longjmp dans le code C++ pour intercepter et lancer des exceptions. Ensuite, utilisez l'instruction import "C" de CGO dans le code GO pour importer la fonction C++ et l'appeler. Ensuite, utilisez les fonctions defer et recovery dans le code GO pour capturer les exceptions levées dans le code C++ et les gérer. Grâce à ces méthodes, des exceptions try and catch peuvent être obtenues lors de l’appel de la bibliothèque SO dynamique C++ dans le processus du langage GO.

Contenu de la question

J'écris un programme Go dans lequel j'utilise cgo pour appeler une bibliothèque dynamique (`.so) écrite en C++ pour gérer le protocole de communication. Le code de cette bibliothèque C++ peut générer des exceptions, j'utilise donc try-catch pour intercepter les exceptions dans le code de la bibliothèque, et je diffère pour intercepter ces exceptions dans le code Go lors de l'appel des fonctions C++ de la bibliothèque.

Mais il s'avère que lorsque C++ essaie d'intercepter l'exception, le code Go ne peut pas intercepter l'exception.

Ma question est de savoir comment intercepter une exception C++ dans le code Go qui est lancée par un cgoappel à une fonction C++.

Solution de contournement

Il n'y a aucun moyen de le faire directement.

Créez un wrapper C/C++ (vous pouvez l'écrire "en ligne" dans le code source Go dans un "commentaire" lié à cgo 相关的“注释”中),该包装器将调用目标 C++ 函数,但会将调用包装在 try/catch 块中,捕获所有内容(std::exception) qui appellera la fonction C++ cible, mais encapsulera l'appel dans try /catch, attrape tout (std::exception) et convertit toutes les exceptions interceptées en valeurs spéciales renvoyées par l'appel.

J'ai trouvé une bonne explication a> sur la façon de procéder, avec des exemples.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer