亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang錯誤處理方式異常與error

 更新時間:2023年01月14日 08:25:34   作者:憑什么我芒果過敏  
我們在使用Golang時,不可避免會遇到異常情況的處理,與Java、Python等語言不同的是,Go中并沒有try...catch...這樣的語句塊,這個時候我們?nèi)绾尾拍芨玫奶幚懋惓D??本文來教你正確方法

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 在 MongoDB 中常用查詢與修改的操作

    Go 在 MongoDB 中常用查詢與修改的操作

    這篇文章主要介紹了Go 在 MongoDB 中常用查詢與修改的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang的關(guān)鍵字defer的使用方法

    Golang的關(guān)鍵字defer的使用方法

    這篇文章主要介紹了Golang的關(guān)鍵字defer的使用方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • 淺析go逆向符號恢復(fù)

    淺析go逆向符號恢復(fù)

    這篇文章主要介紹了go逆向符號恢復(fù)的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Go雪花算法的作用領(lǐng)域及實現(xiàn)方法示例

    Go雪花算法的作用領(lǐng)域及實現(xiàn)方法示例

    這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn)

    go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn)

    本文主要介紹了go語言yaml轉(zhuǎn)map、map遍歷的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語言學(xué)習(xí)之循環(huán)語句使用詳解

    Go語言學(xué)習(xí)之循環(huán)語句使用詳解

    這篇文章主要為大家介紹了Go語言中的常用循環(huán)語句的使用,例如:for循環(huán)、for-each、break等,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-04-04
  • Go?模塊在下游服務(wù)抖動恢復(fù)后CPU占用無法恢復(fù)原因

    Go?模塊在下游服務(wù)抖動恢復(fù)后CPU占用無法恢復(fù)原因

    這篇文章主要為大家介紹了Go?模塊在下游服務(wù)抖動恢復(fù)后CPU占用無法恢復(fù)原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Go整合ElasticSearch的示例代碼

    Go整合ElasticSearch的示例代碼

    這篇文章主要介紹了Go整合ElasticSearch的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Go 語言中 20 個占位符的整理

    Go 語言中 20 個占位符的整理

    這篇文章主要介紹了Go 語言中 20 個占位符的整理,看完本篇文章講學(xué)會什么是占位符?哪些函數(shù)支持?如何使用占位符?不同的占位符的作用?配合占位符的幾個標記符號用法?
    2021-10-10
  • GoLang橋接模式的實現(xiàn)示例

    GoLang橋接模式的實現(xiàn)示例

    橋接模式是一種結(jié)構(gòu)型設(shè)計模式,通過橋接模式可以將抽象部分和它的實現(xiàn)部分分離,本文主要介紹了GoLang橋接模式,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論