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.
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 cgo
appel à une fonction C++.
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!