Go語(yǔ)言錯(cuò)誤處理異常捕獲+異常拋出
前言:
Go 語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以,Go 語(yǔ)言不支持傳統(tǒng)的 try…catch…finally 這種處理。
Go 中引入的錯(cuò)誤處理方式為:defer, panic, recover,也僅僅是錯(cuò)處處理的模擬
Go語(yǔ)言的作者認(rèn)為java等語(yǔ)言的錯(cuò)誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯(cuò)誤類(lèi)型以及
簡(jiǎn)單的異常捕獲,雖然簡(jiǎn)單但是也非常精妙,大大的提高了運(yùn)行效率。
一、error變量可以做什么
1.定義一個(gè)error變量
①直接new一個(gè)
err := errors.New("我是錯(cuò)誤處理語(yǔ)句")
②實(shí)現(xiàn)Error接口
只要實(shí)現(xiàn)了Error接口就可以被error類(lèi)型所接收,打印的時(shí)候會(huì)直接打印實(shí)現(xiàn)接口時(shí),方法返回的字符串。
官方接口如下:
type error interface {
? ? Error() string
}代碼如下:
//定義一個(gè)結(jié)構(gòu)體
type man struct {
?? ?age int
}
//實(shí)現(xiàn)接口
func (a man) Error() string {
?? ?str := "這是一個(gè)錯(cuò)誤接口"
?? ?return str
}
//創(chuàng)建函數(shù)返回錯(cuò)誤類(lèi)型
func judgeAge() (int, error) {
?? ?var a man
?? ?return 0, a
}
//主函數(shù)調(diào)用
func main() {
?? ?_, e := judgeAge()
?? ?if e!=nil{
?? ??? ?fmt.Println(e)
?? ?}
}2.錯(cuò)誤的處理
將如果錯(cuò)誤變量不為空,則將錯(cuò)誤進(jìn)行捕獲打印,這里直接打印到了控制臺(tái),可以將錯(cuò)誤打印到日志文件內(nèi),為以后系統(tǒng)的維護(hù)做保障。
代碼如下:
package main
import (
?? ?"errors"
?? ?"fmt"
)
func main() {
?? ?err := errors.New("我是錯(cuò)誤處理語(yǔ)句")
?? ?if err != nil {
?? ??? ?fmt.Println(err)
?? ?}else {
?? ??? ?fmt.Println("沒(méi)有錯(cuò)誤")
?? ?}
?? ?fmt.Println(123)
}3.做函數(shù)返回值
- 如果函數(shù)返回的錯(cuò)誤類(lèi)型值不為空,則將其進(jìn)行打印
代碼如下:
package main
import (
?? ?"errors"
?? ?"fmt"
)
func test(num1,num2 int) error {
?? ?if num2 == 0 {
?? ??? ?return errors.New("除數(shù)為零")
?? ?}
?? ?res := num1 / num2
?? ?fmt.Println("計(jì)算結(jié)果為=", res)
?? ?return nil
}
func main() {
?? ?err := test(11,0)
?? ?if err!=nil{
?? ??? ?fmt.Println(err)
?? ?}
}4.做函數(shù)參數(shù)
一般用作處理錯(cuò)誤變量,在需要進(jìn)行錯(cuò)誤檢驗(yàn)的時(shí)候調(diào)用函數(shù),不用再進(jìn)行判斷了
代碼如下:
func PrintError(err error){
?? ?if err!=nil{
?? ??? ?fmt.Println(err)
?? ?}
}二、模擬異常的捕獲與拋出
1.defer簡(jiǎn)介
defer后面定義的東西是在調(diào)用函數(shù)執(zhí)行完的時(shí)候執(zhí)行的代碼,一般用于文件描述符、數(shù)據(jù)庫(kù)對(duì)象的關(guān)閉(在之前講管道的時(shí)候有介紹過(guò))
defer什么什么延時(shí)執(zhí)行
代碼如下:
func pDefer() {
?? ?defer fmt.Println("hahaha")
?? ?fmt.Println("hello")
}
func main() {
?? ?pDefer()
}
/*
打印結(jié)果
?? ?hello
?? ?hahaha
*/2.使用recover模擬異常的捕獲
代碼如下:
package main
import (
?? ?"fmt"
)
func test() {
?? ?//使用defer + recover 來(lái)捕獲和處理異常(返回錯(cuò)誤變量)
?? ?//函數(shù)執(zhí)行末尾執(zhí)行這個(gè)匿名函數(shù)
?? ? defer func() {
?? ? ?? ?err := recover() // recover()內(nèi)置函數(shù),可以捕獲到異常
?? ? ?? ?if err != nil { ?//說(shuō)明捕獲到錯(cuò)誤
?? ? ?? ??? ?fmt.Println(err)
?? ? ?? ?}
?? ? }()
?? ?num1 := 10
?? ?num2 := 0
?? ?res := num1 / num2
?? ?fmt.Println("計(jì)算結(jié)果為=", res)
}
func main() {
?? ?test()
}3.使用panic主動(dòng)拋出錯(cuò)誤
異常的捕獲,使程序還能夠正常的運(yùn)行,如果有致命錯(cuò)誤就需要進(jìn)行錯(cuò)誤的拋出了,也就是宕機(jī),不到迫不得已千萬(wàn)不要使用這個(gè)函數(shù),有可能會(huì)造成大量數(shù)據(jù)的丟失
代碼如下:
package main
import (
?? ?"errors"
?? ?"fmt"
)
func test() error {
?? ?num1 := 10
?? ?num2 := 0
?? ?if num2 == 0 {
?? ??? ?return errors.New("除數(shù)為零")
?? ?}
?? ?res := num1 / num2
?? ?fmt.Println("計(jì)算結(jié)果為=", res)
?? ?return nil
}
func main() {
?? ?//無(wú)論err是否為空,都進(jìn)行程序的終止
?? ? panic(test())//內(nèi)置函數(shù)2,參數(shù)使一個(gè)interface接口
}運(yùn)行結(jié)果:

總結(jié):
Go語(yǔ)言雖然沒(méi)有一個(gè)較為成熟的異常捕獲機(jī)制,但是其精簡(jiǎn)的錯(cuò)誤處理仍舊能夠滿(mǎn)足其需求,減少錯(cuò)誤的處理大大的加快了我們的開(kāi)發(fā)效率,代碼的運(yùn)行效率。
到此這篇關(guān)于Go語(yǔ)言錯(cuò)誤處理異常捕獲+異常拋出的文章就介紹到這了,更多相關(guān)Go語(yǔ)言異常捕獲和異常拋出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言 xorm框架 postgresql 的用法及詳細(xì)注解
這篇文章主要介紹了go語(yǔ)言 xorm框架 postgresql 的用法及詳細(xì)注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例
golang中提供了2種定時(shí)器timer和ticker,分別是一次性定時(shí)器和重復(fù)任務(wù)定時(shí)器。這篇文章主要介紹了用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-05-05
詳解 Go 語(yǔ)言中 Map 類(lèi)型和 Slice 類(lèi)型的傳遞
這篇文章主要介紹了詳解 Go 語(yǔ)言中 Map 類(lèi)型和 Slice 類(lèi)型的傳遞的相關(guān)資料,需要的朋友可以參考下2017-09-09
Go語(yǔ)言標(biāo)準(zhǔn)錯(cuò)誤error全面解析
Go語(yǔ)言中的錯(cuò)誤處理是通過(guò)內(nèi)置的error接口來(lái)實(shí)現(xiàn)的,其中errorString和wrapError是兩種常見(jiàn)的錯(cuò)誤類(lèi)型實(shí)現(xiàn)方式,errorString通過(guò)errors.New()方法實(shí)現(xiàn),而wrapError則通過(guò)fmt.Errorf()方法實(shí)現(xiàn),支持錯(cuò)誤的嵌套和解析2024-10-10
Go?channel結(jié)構(gòu)體源碼和讀寫(xiě)和關(guān)閉過(guò)程詳解
這篇文章主要介紹了Go?channel結(jié)構(gòu)體源碼和讀寫(xiě)和關(guān)閉過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

