日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Golang錯誤處理方式異常與error_Golang

作者:憑什么我芒果過敏 ? 更新時間: 2023-03-04 編程語言

Go 提供了兩種處理錯誤 方式,

一 種是借助 panic和 recover 的拋出捕獲機制,

另一種使用error 錯誤類型

一、異常

1、go沒有try/catch,而是使用panic/recover。

panic包出異常,后續代碼不再執行

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)
}

執行結果:錯誤

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傳入的內容
		}
	}()
	send(1, 0)
	fmt.Println("end")
}

執行結果:正常退出

2、panic被觸發的情況

1)用戶顯視調用panic

2)go內部自動檢測出空指針、數組越界等情況,會隱式報出panic,不需要用戶主動調用

隱式例子如下:其實程序會自動拋出異常,不需要寫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傳入的內容
		}
	}()
	send(1, 0)
	fmt.Println("end")
}

二、錯誤

如果使用panic,最主要的是“報panic之后的函數都不會被執行,由defer recover”

那么對于服務使用panic,那后面的業務就都不被執行了,那假如這其實是個我自己寫的小錯誤呢?

比如:我的程序不允許我自定義的變量為空,為空的話我難道直接panic?那假如我程序還有別的接口邏輯假如沒用到這個變量呢?直接panic豈不是服務掛了。

所以其實我能日志報出來這個錯誤就行了——error

https://segmentfault.com/q/1010000020000806

go提供了接口類型error:

type error interface {
	Error() string
}

故自定義錯誤需要實現接口中的方法。

需要注意,方法的接受者如果是值,則調用相當于進行值拷貝,對副本進行修改不會改變原值

方法的接受者是引用,相當于傳遞的是變量的地址,原變量值才會被修改

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)
}

原文鏈接:https://blog.csdn.net/weixin_40906441/article/details/128660151

欄目分類
最近更新