Golang錯(cuò)誤處理方式異常與error
Go 提供了兩種處理錯(cuò)誤 方式,
一 種是借助 panic和 recover 的拋出捕獲機(jī)制,
另一種使用error 錯(cuò)誤類(lèi)型
一、異常
1、go沒(méi)有try/catch,而是使用panic/recover。
panic包出異常,后續(xù)代碼不再執(zhí)行
recover再defer中捕獲異常,使groutine(即程序)能夠正常退出。
1)只有panic,而沒(méi)有recover,程序宕機(jī)無(wú)法正常退出
package main import "fmt" func send(a, b int) int { if b == 0 { panic("wrong div") } c := a / b return c } func main() { defer func() { fmt.Println("wrong") }() send(1, 0) }
執(zhí)行結(jié)果:錯(cuò)誤
2) 正確情況,使用panic、recover
package main import "fmt" func send(a, b int) int { if b == 0 { panic("wrong div") } c := a / b return c } func main() { defer func() { fmt.Println("wrong") if err := recover(); err != nil { fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容 } }() send(1, 0) fmt.Println("end") }
執(zhí)行結(jié)果:正常退出
2、panic被觸發(fā)的情況
1)用戶(hù)顯視調(diào)用panic
2)go內(nèi)部自動(dòng)檢測(cè)出空指針、數(shù)組越界等情況,會(huì)隱式報(bào)出panic,不需要用戶(hù)主動(dòng)調(diào)用
隱式例子如下:其實(shí)程序會(huì)自動(dòng)拋出異常,不需要寫(xiě)panic語(yǔ)句
package main import "fmt" func send(a, b int) int { c := a / b return c } func main() { defer func() { fmt.Println("wrong") if err := recover(); err != nil { fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容 } }() send(1, 0) fmt.Println("end") }
二、錯(cuò)誤
如果使用panic,最主要的是“報(bào)panic之后的函數(shù)都不會(huì)被執(zhí)行,由defer recover”
那么對(duì)于服務(wù)使用panic,那后面的業(yè)務(wù)就都不被執(zhí)行了,那假如這其實(shí)是個(gè)我自己寫(xiě)的小錯(cuò)誤呢?
比如:我的程序不允許我自定義的變量為空,為空的話我難道直接panic?那假如我程序還有別的接口邏輯假如沒(méi)用到這個(gè)變量呢?直接panic豈不是服務(wù)掛了。
所以其實(shí)我能日志報(bào)出來(lái)這個(gè)錯(cuò)誤就行了——error
https://segmentfault.com/q/1010000020000806
go提供了接口類(lèi)型error:
type error interface { Error() string }
故自定義錯(cuò)誤需要實(shí)現(xiàn)接口中的方法。
需要注意,方法的接受者如果是值,則調(diào)用相當(dāng)于進(jìn)行值拷貝,對(duì)副本進(jìn)行修改不會(huì)改變?cè)?/p>
方法的接受者是引用,相當(dāng)于傳遞的是變量的地址,原變量值才會(huì)被修改
package main import "fmt" type getName interface { printName() changeName() changeName2() } type dog struct { name string age int } type cat struct { name string age string } func (d dog) printName() { fmt.Println(d.name) } func (d dog) changeName() { d.name = "d2" } func (d *dog) changeName2() { d.name = "d2" } func (c cat) printName() { fmt.Println(c.name) } func main() { d := &dog{ name: "d1", age: 1, } d.printName() d.changeName() fmt.Println("changeName", d.name) d.changeName2() fmt.Println("changeName2", d.name) }
到此這篇關(guān)于Golang錯(cuò)誤處理方式異常與error的文章就介紹到這了,更多相關(guān)Go異常與error內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解golang函數(shù)多返回值錯(cuò)誤處理與error類(lèi)型
- Go語(yǔ)言中的錯(cuò)誤處理最佳實(shí)踐詳解
- 重學(xué)Go語(yǔ)言之錯(cuò)誤處理與異常機(jī)制詳解
- Go語(yǔ)言中錯(cuò)誤處理的方式總結(jié)
- Go語(yǔ)言中實(shí)現(xiàn)完美錯(cuò)誤處理實(shí)踐分享
- Golang中的錯(cuò)誤處理深入分析
- Golang中的錯(cuò)誤處理的示例詳解
- Golang中的錯(cuò)誤處理的示例詳解
- Go 代碼規(guī)范錯(cuò)誤處理示例經(jīng)驗(yàn)總結(jié)
- Go?錯(cuò)誤處理實(shí)踐總結(jié)示例
- Go錯(cuò)誤處理的幾種方式
相關(guān)文章
Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn)
本文主要介紹了go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Go語(yǔ)言學(xué)習(xí)之循環(huán)語(yǔ)句使用詳解
這篇文章主要為大家介紹了Go語(yǔ)言中的常用循環(huán)語(yǔ)句的使用,例如:for循環(huán)、for-each、break等,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-04-04Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無(wú)法恢復(fù)原因
這篇文章主要為大家介紹了Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無(wú)法恢復(fù)原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11