使用 go 時,有一種模式用于定義錯誤并以(對我而言)非常奇特的方式處理它們。通常錯誤聲明為ErrorSomethingWentWrong = errors.New("Just an example!"). 您可以用來errors.Is(err, ErrorSomethingWentWrong)捕獲該特定錯誤。該Is函數可以通過比較指針來做到這一點。但是為了進行比較,我需要知道哪個變量名用于定義,errorString以便我可以用來errors.Is捕獲它。例如:ErrorSomethingWentWrong = errors.New("Just an example!")func DoSomething() (*Something, error) { return nil, ErrorSomethingWentWrong}我知道字符串返回了一個錯誤"Just an example!",但我不知道它有變量名ErrorSomethingWentWrong:func checkError() { if errors.Is(err, ErrorSomethingWentWrong){ // how to know this??? //handle error }}當我使用時,errors.Is(err, ErrorSomethingWentWrong)我可以捕獲并處理這個錯誤。使用調試時,我看不到errorString代表ErrorSomethingWentWrong變量。但是當我不知道變量名是什么時,ErrorSomethingWentWrong我需要對代碼進行逆向工程或閱讀文檔以了解返回了哪個錯誤。
1 回答

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
如果我理解正確,這是你的場景:
您從包中收到一個錯誤,并且沒有文檔可以為您提供您應該處理的錯誤。您正在調試,看到一個errors.errorString,但不知道是否有可以比較的全局和公共錯誤值。
不幸的是,這是一個值,調試器無法告訴您這是一個全局變量還是哪個,因為您沒有收到變量,只有一個值。
你可以:
通讀你正在調用的包的源代碼,看看返回了哪些錯誤以及如何處理它們
在源代碼中搜索錯誤字符串中的文本,這可以幫助您查明定義或創建錯誤的位置。
如果事實證明您希望處理的特定錯誤未在全局范圍內定義(并且重寫包對您的情況不可行),那么您將無法處理它。如果有人errors.New在函數內部使用(不好的做法),就會發生這種情況。那么你也可以試試這些:
func handleError(err error) {
if err.Error() == "full error string" {}
if strings.Contains(err.Error(), "partial error string") {}
}
但那些都是丑陋的恕我直言。
TL;DR這是不可能的,你必須閱讀源代碼。
- 1 回答
- 0 關注
- 109 瀏覽
添加回答
舉報
0/150
提交
取消