使用 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我需要對代碼進行逆向工程或閱讀檔案以了解回傳了哪個錯誤。

那么你怎么知道使用除錯或反射來檢索錯誤變數名呢?
uj5u.com熱心網友回復:
如果我理解正確,這是你的場景:
您從包中收到一個錯誤,并且沒有檔案可以為您提供您應該處理的錯誤。您正在除錯,看到一個errors.errorString,但不知道是否有可以比較的全域和公共錯誤值。
不幸的是,這是一個值,除錯器無法告訴您這是一個全域變數還是哪個,因為您沒有收到變數,只有一個值。
你可以:
- 通讀你正在呼叫的包的源代碼,看看回傳了哪些錯誤以及如何處理它們
- 在源代碼中搜索錯誤字串中的文本,這可以幫助您查明定義或創建錯誤的位置。
如果事實證明您希望處理的特定錯誤未在全域范圍內定義(并且重寫包對您的情況不可行),那么您將無法處理它。如果有人errors.New在函式內部使用(不好的做法),就會發生這種情況。那么你也可以試試這些:
func handleError(err error) {
if err.Error() == "full error string" {}
if strings.Contains(err.Error(), "partial error string") {}
}
但那些都是丑陋的恕我直言。
TL;DR這是不可能的,你必須閱讀源代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535748.html
標籤:去设计模式错误处理
上一篇:Golang中是否有Python的`os.system()`的等價物?[復制]
下一篇:按數字拆分big.Int
