W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
原文鏈接:https://gopl-zh.github.io/ch7/ch7-08.html
從本書的開始,我們就已經(jīng)創(chuàng)建和使用過神秘的預(yù)定義error類型,而且沒有解釋它究竟是什么。實際上它就是interface類型,這個類型有一個返回錯誤信息的單一方法:
type error interface {
Error() string
}
創(chuàng)建一個error最簡單的方法就是調(diào)用errors.New函數(shù),它會根據(jù)傳入的錯誤信息返回一個新的error。整個errors包僅只有4行:
package errors
func New(text string) error { return &errorString{text} }
type errorString struct { text string }
func (e *errorString) Error() string { return e.text }
承載errorString的類型是一個結(jié)構(gòu)體而非一個字符串,這是為了保護它表示的錯誤避免粗心(或有意)的更新。并且因為是指針類型*errorString
滿足error接口而非errorString類型,所以每個New函數(shù)的調(diào)用都分配了一個獨特的和其他錯誤不相同的實例。我們也不想要重要的error例如io.EOF和一個剛好有相同錯誤消息的error比較后相等。
fmt.Println(errors.New("EOF") == errors.New("EOF")) // "false"
調(diào)用errors.New函數(shù)是非常稀少的,因為有一個方便的封裝函數(shù)fmt.Errorf,它還會處理字符串格式化。我們曾多次在第5章中用到它。
package fmt
import "errors"
func Errorf(format string, args ...interface{}) error {
return errors.New(Sprintf(format, args...))
}
雖然*errorString
可能是最簡單的錯誤類型,但遠非只有它一個。例如,syscall包提供了Go語言底層系統(tǒng)調(diào)用API。在多個平臺上,它定義一個實現(xiàn)error接口的數(shù)字類型Errno,并且在Unix平臺上,Errno的Error方法會從一個字符串表中查找錯誤消息,如下面展示的這樣:
package syscall
type Errno uintptr // operating system error code
var errors = [...]string{
1: "operation not permitted", // EPERM
2: "no such file or directory", // ENOENT
3: "no such process", // ESRCH
// ...
}
func (e Errno) Error() string {
if 0 <= int(e) && int(e) < len(errors) {
return errors[e]
}
return fmt.Sprintf("errno %d", e)
}
下面的語句創(chuàng)建了一個持有Errno值為2的接口值,表示POSIX ENOENT狀況:
var err error = syscall.Errno(2)
fmt.Println(err.Error()) // "no such file or directory"
fmt.Println(err) // "no such file or directory"
err的值圖形化的呈現(xiàn)在圖7.6中。
Errno是一個系統(tǒng)調(diào)用錯誤的高效表示方式,它通過一個有限的集合進行描述,并且它滿足標(biāo)準(zhǔn)的錯誤接口。我們會在第7.11節(jié)了解到其它滿足這個接口的類型。
![]() | ![]() |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: