golang函數(shù)四(錯(cuò)誤處理)-創(chuàng)新互聯(lián)

為了方便實(shí)現(xiàn)自定義錯(cuò)誤類(lèi)型,Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中將error定義為接口類(lèi)型。比如:

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶(hù);涵蓋的客戶(hù)類(lèi)型包括:成都衛(wèi)生間隔斷等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶(hù)的一致稱(chēng)揚(yáng)!
type error interface{
    Error() string
}

按照Go語(yǔ)言編程習(xí)慣,error總是最后一個(gè)函數(shù)返回值,并且標(biāo)準(zhǔn)庫(kù)提供了創(chuàng)建函數(shù),可以方便的創(chuàng)建錯(cuò)誤消息的error對(duì)象。比如:

func divTest(x ,y int)(int, error){
    if y == 0{
        return 0, errors.New("division by zero") //創(chuàng)建錯(cuò)誤消息的error對(duì)象
    }   
    return x/y,nil
}
func main(){
    v, err := divTest(3,0)
    if err != nil{
        log.Fatalln(err.Error())
    }   
    println(v)
}

日常開(kāi)發(fā)中,我們需要根據(jù)需求自定義錯(cuò)誤類(lèi)型,可以存放更多的上下文信息,或者根據(jù)錯(cuò)誤類(lèi)型做出相應(yīng)的錯(cuò)誤處理。比如:

type NegativeError struct{
    x, y int
}
func (NegativeError)Error()string{
    return "negative value error"
}

type MolError struct {
    x, y int
}
func (MolError)Error()string{
    return "devision by zero"
}

func molTest(x ,y int)(int, error){
    if y == 0{
        return 0, MolError{x,y}
    }
    if x < 0 || y < 0{
        return 0, NegativeError{x,y}
    }
    return x%y,nil
}

func main(){
    v, err := molTest(3,-1)
    if err != nil{
        switch e := err.(type){     //獲取錯(cuò)誤類(lèi)型
            case MolError:
                println(e.x,e.y)
            case NegativeError:
                println(e.x,e.y)
            default:
                println(e)
        }
        log.Fatalln(err.Error())
    }
    println(v)
}

與error相比,panic/recover 在應(yīng)用上更類(lèi)似于 try/catch 結(jié)構(gòu)化。比如:

func panic() interface{}   
func recover() interface{}

兩者區(qū)別:panic 立即中斷當(dāng)前函數(shù)處理流程,執(zhí)行延遲調(diào)用。recover在延遲調(diào)用中可以捕獲并返回panic產(chǎn)生的錯(cuò)誤對(duì)象,比如:

func Myrecover(){
    if err := recover(); err != nil{
        log.Fatalln(err)
    }   
}

func main(){
    println("start...")
    defer Myrecover()
    panic("dead")
    println("end...")
}
輸出:
start...
2017/02/09 11:24:13 dead
exit status 1

如果有連續(xù)多次調(diào)用panic的場(chǎng)景,只有最后一次panic會(huì)被recover捕獲處理,比如:

func Myrecover(){
    if err := recover(); err != nil{
        log.Fatalln(err)
    }   
}

func main(){
    defer Myrecover()
    defer func(){
        panic("a bad problem")
    }()
    panic("a problem")
}
輸出:
2017/02/09 11:31:50 a bad problem
exit status 1

recover只有在延遲調(diào)用函數(shù)中才能得到正常工作,比如:

func main() {
    defer Myrecover()
    defer log.Println(recover())
    defer println(recover())
    panic("a problem") 
}
輸出:
(0x0,0x0)
2016/11/12 07:07:54 <nil>
2016/11/12 07:07:54 a problem
exit status 1

在日常開(kāi)發(fā)過(guò)程中,經(jīng)常需要進(jìn)行調(diào)試,可以使用函數(shù)輸出完整的調(diào)用棧信息,比如:

func Myrecover(){
    if err := recover(); err != nil{
        fmt.Println(err)
        debug.PrintStack()
        //log.Fatalln(err)
    }
}
func main(){
    defer Myrecover()
    panic("a problem")
}
輸出:
a problem
goroutine 1 [running]:
runtime/debug.Stack(0xc42002c010, 0xc42003fe20, 0x1)
	/root/data/go/src/runtime/debug/stack.go:24 +0x79
runtime/debug.PrintStack()
	/root/data/go/src/runtime/debug/stack.go:16 +0x22
main.Myrecover()
	/root/data/gopath/test/panic.go:10 +0x85
panic(0x48a5e0, 0xc42000a320)
	/root/data/go/src/runtime/panic.go:458 +0x243
main.main()
	/root/data/gopath/test/panic.go:16 +0x8d

日常開(kāi)發(fā)中,只有在系統(tǒng)發(fā)生了不可恢復(fù)性或無(wú)法正常工作的錯(cuò)誤可以使用panic,比如端口號(hào)被占用、數(shù)據(jù)庫(kù)未啟動(dòng)、文件系統(tǒng)錯(cuò)誤等,否則不建議使用。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

名稱(chēng)欄目:golang函數(shù)四(錯(cuò)誤處理)-創(chuàng)新互聯(lián)
鏈接分享:http://muchs.cn/article38/eeisp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、Google標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)