php小編魚仔在GO語言開發中,如果想要在CGO調用C++動態SO庫時獲取try和catch異常,可以采取一些方法。首先,可以在C++代碼中使用setjmp和longjmp函數來捕獲和拋出異常。然后,在GO代碼中使用CGO的import “C”語句將C++函數導入并進行調用。接著,在GO代碼中使用defer和recover函數來捕獲C++代碼中拋出的異常,并進行處理。通過這些方法,可以在GO語言流程中調用C++動態SO庫時獲取try和catch異常。
問題內容
我正在編寫一個Go程序,在這個程序中我使用cgo
來調用用C++編寫的動態庫(`.so)來處理通信協議。該 C++ 庫中的代碼可能會拋出異常,因此我使用 try-catch 來捕獲庫代碼中的異常,并在調用庫的 C++ 函數時使用 defer 在 Go 代碼中捕獲這些異常。
但事實證明,當c++嘗試捕獲異常時,Go代碼無法捕獲異常。
我的問題是如何在Go代碼中捕獲C++異常,該異常通過cgo
調用拋出C++函數。
解決方法
無法直接執行此操作。
創建一個 C/C++ 包裝器(您可以將其“內聯”寫入 Go 源代碼中與 cgo
相關的“注釋”中),該包裝器將調用目標 C++ 函數,但會將調用包裝在 try
/catch
塊中,捕獲所有內容(std::exception
)并將任何捕獲的異常轉換為從調用返回的特殊值。
找到很好的解釋 a> 如何做到這一點,并舉例說明。