1 回答

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
由于 panic 和 “軟” 錯(cuò)誤都是程序異常,因此應(yīng)保留非 nil 錯(cuò)誤語義。可以將錯(cuò)誤包裝在自定義類型或簡(jiǎn)單的 error 變量中,并在函數(shù)調(diào)用后進(jìn)行檢查。
此外,為了實(shí)際修改返回的錯(cuò)誤,您還應(yīng)該:
在延遲函數(shù)文本中使用
recover()
使用命名的返回參數(shù)
從規(guī)范延遲聲明:
例如,如果延遲函數(shù)是函數(shù)文本,并且周圍的函數(shù)已命名了文本范圍內(nèi)的結(jié)果參數(shù),則延遲函數(shù)可以在返回結(jié)果參數(shù)之前訪問和修改結(jié)果參數(shù)
package main
import (
"errors"
"fmt"
"log"
)
var ErrPanicRecovered = errors.New("recovered from panic")
// named return parameters
func recoverableFoo() (i int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%w: %v", ErrPanicRecovered, r)
}
}()
// panic("problem!") // or any call that may panic; uncomment to test
return 1, nil
}
func main() {
x, err := foo()
if err != nil {
if errors.Is(err, ErrPanicRecovered) {
log.Fatal("panicked: ", err)
}
log.Printf("some other error: %s", err.Error())
return
}
fmt.Println("after foo x = " + fmt.Sprint(x))
}
特別是,使用fmt。帶有格式設(shè)置謂詞的 Errorf 允許您正確包裝錯(cuò)誤,并在以后檢查錯(cuò)誤。是:%w
如果格式說明符包含帶有錯(cuò)誤操作數(shù)的謂詞,則返回的錯(cuò)誤將實(shí)現(xiàn)返回操作數(shù)的 Unwrap 方法。%w
游樂場(chǎng): https://play.golang.org/p/p-JI1B0cw3x
- 1 回答
- 0 關(guān)注
- 89 瀏覽
添加回答
舉報(bào)