ホームページ  >  記事  >  バックエンド開発  >  CGO は、GO 言語プロセスで C++ 動的 SO ライブラリを呼び出すときに、try and catch 例外をどのように取得しますか?

CGO は、GO 言語プロセスで C++ 動的 SO ライブラリを呼び出すときに、try and catch 例外をどのように取得しますか?

WBOY
WBOY転載
2024-02-11 15:20:09502ブラウズ

CGO は、GO 言語プロセスで C++ 動的 SO ライブラリを呼び出すときに、try and catch 例外をどのように取得しますか?

php editor Yuzai は GO 言語を開発していますが、CGO が C 動的 SO ライブラリを呼び出すときに Try and catch 例外を取得したい場合は、いくつかのメソッドを使用できます。まず、C コードで setjmp 関数と longjmp 関数を使用して、例外をキャッチしてスローできます。次に、GO コード内で CGO の import "C" ステートメントを使用して C 関数をインポートし、呼び出します。次に、GO コードで defer 関数と Recovery 関数を使用して、C コードでスローされた例外をキャプチャして処理します。これらのメソッドを通じて、GO 言語プロセスで C 動的 SO ライブラリを呼び出すときに、try and catch 例外を取得できます。

質問内容

私は、通信プロトコルを処理するために C で書かれた動的ライブラリ (`.so) を cgo を使用して呼び出す Go プログラムを作成しています。この C ライブラリのコードは例外をスローする可能性があるため、try-catch を使用してライブラリ コードで例外をキャッチし、ライブラリの C 関数を呼び出すときに Go コードでこれらの例外をキャッチすることを延期します。

しかし、c が例外をキャッチしようとしても、Go コードは例外をキャッチできないことがわかりました。

私の質問は、C 関数への cgo 呼び出しによってスローされる C 例外を Go コードでキャッチする方法です。

解決策

この操作は直接実行できません。

目的の C 関数を呼び出す C/C ラッパーを作成します (Go ソース コードの cgo に関連する「コメント」内に「インライン」で記述することができます)。このラッパーは目的の C 関数を呼び出しますが、呼び出しをラップします。 try/catch ブロックで、すべて (std::Exception) をキャッチし、キャッチされた例外を呼び出し特殊値から返されるように変換します。

これを行う方法について、例を示した適切な説明 が見つかりました。 a>

以上がCGO は、GO 言語プロセスで C++ 動的 SO ライブラリを呼び出すときに、try and catch 例外をどのように取得しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。