Golang錯誤處理方式異常與error
Go 提供了兩種處理錯誤 方式,
一 種是借助 panic和 recover 的拋出捕獲機制,
另一種使用error 錯誤類型
一、異常
1、go沒有try/catch,而是使用panic/recover。
panic包出異常,后續(xù)代碼不再執(zhí)行
recover再defer中捕獲異常,使groutine(即程序)能夠正常退出。
1)只有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")
}()
send(1, 0)
}
執(zhí)行結(jié)果:錯誤

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其實就是panic傳入的內(nèi)容
}
}()
send(1, 0)
fmt.Println("end")
}
執(zhí)行結(jié)果:正常退出

2、panic被觸發(fā)的情況
1)用戶顯視調(diào)用panic
2)go內(nèi)部自動檢測出空指針、數(shù)組越界等情況,會隱式報出panic,不需要用戶主動調(diào)用
隱式例子如下:其實程序會自動拋出異常,不需要寫panic語句
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其實就是panic傳入的內(nèi)容
}
}()
send(1, 0)
fmt.Println("end")
}
二、錯誤
如果使用panic,最主要的是“報panic之后的函數(shù)都不會被執(zhí)行,由defer recover”
那么對于服務(wù)使用panic,那后面的業(yè)務(wù)就都不被執(zhí)行了,那假如這其實是個我自己寫的小錯誤呢?
比如:我的程序不允許我自定義的變量為空,為空的話我難道直接panic?那假如我程序還有別的接口邏輯假如沒用到這個變量呢?直接panic豈不是服務(wù)掛了。
所以其實我能日志報出來這個錯誤就行了——error
https://segmentfault.com/q/1010000020000806
go提供了接口類型error:
type error interface {
Error() string
}
故自定義錯誤需要實現(xiàn)接口中的方法。
需要注意,方法的接受者如果是值,則調(diào)用相當于進行值拷貝,對副本進行修改不會改變原值
方法的接受者是引用,相當于傳遞的是變量的地址,原變量值才會被修改
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錯誤處理方式異常與error的文章就介紹到這了,更多相關(guān)Go異常與error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸
這篇文章主要介紹了Go語言中如何確保Cookie數(shù)據(jù)的安全傳輸,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Go?Singleflight導(dǎo)致死鎖問題解決分析
這篇文章主要為大家介紹了Go?Singleflight導(dǎo)致死鎖問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn)
這篇文章主要介紹了golang通過context控制并發(fā)的應(yīng)用場景實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

