Go Wiki:錯誤
錯誤的指示方式為從函式傳回 error
作為額外的傳回值。nil
值表示沒有錯誤。
error
可以透過呼叫 Error
(其唯一的方法)轉換為字串。您可以透過呼叫 errors.New
從字串建立錯誤
if failure {
return errors.New("inverse tachyon pulse failed")
}
或使用 fmt.Errorf
if failure {
return fmt.Errorf("inverse tachyon pulse failed")
}
錯誤字串不應以大寫字母開頭,因為它們通常會在列印前加上前綴
err := TryInverseTachyonPulse()
if err != nil {
fmt.Printf("failed to solve problem: %s\n", err)
}
如果您希望呼叫程式碼能夠處理錯誤,您可以透過傳回特殊值或新的類型來區分錯誤類別。您只需要區分呼叫程式碼可以預期以這種方式處理的差異,因為字串允許您傳達錯誤的詳細資料。
io.EOF
是表示串流結束的特殊值。您可以直接將錯誤值與 io.EOF 進行比較。
如果您想使用錯誤攜帶額外資料,可以使用新的類型
type ParseError struct {
Line, Col int
}
func (p ParseError) Error() string {
return fmt.Sprintf("parse error on line %d, column %d", p.Line, p.Col)
}
如果您想建立常數字串錯誤,可以使用命名類型字串
type errorConst string
const ErrTooManyErrors errorConst = "too many errors found."
func (e errorConst) Error() string {
return string(e)
}
呼叫程式碼會使用類型轉換來測試特殊類型的 error
switch err := err.(type) {
case ParseError:
PrintParseError(err)
}
命名
錯誤類型以 "Error"
結尾,錯誤變數以 "Err"
或 "err"
開頭
package somepkg
// ParseError is type of error returned when there's a parsing problem.
type ParseError struct {
Line, Col int
}
var ErrBadAction = errors.New("somepkg: a bad action was performed")
// -----
package foo
func foo() {
res, err := somepkgAction()
if err != nil {
if err == somepkg.ErrBadAction {
}
if pe, ok := err.(*somepkg.ParseError); ok {
line, col := pe.Line, pe.Col
// ....
}
}
}
參考
- 錯誤 (規格):https://go.dev.org.tw/ref/spec#Errors
- 套件
errors
:https://pkg.go.dev/errors/ - 類型轉換:https://go.dev.org.tw/ref/spec#TypeSwitchStmt
此內容是 Go Wiki 的一部分。