您好,登錄后才能下訂單哦!
這篇“GO語言中err接口及defer延遲異常怎么處理”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“GO語言中err接口及defer延遲異常怎么處理”文章吧。
Go語言引入了一個關于錯誤處理的標準模式,即error接口,它是Go語言內(nèi)建的接口類型,該接口的定義如下:
type error interface { Error() string }
調(diào)用對應接口
err:=errors.New("this is normal err") fmt.Println(err.Error()) err2:=fmt.Errorf("this is normal err") fmt.Println(err2)
案例:除數(shù)b為0時
package main import ( "errors" "fmt" ) func main() { //接收錯誤信息和正確信息 result,err := test(5,0) //加了判斷,如果沒有錯誤err=nil if err!=nil{ fmt.Println(err) }else { fmt.Println(result) } } //b為0時拋出異常 func test(a,b int) (result int, err error) { //返回錯誤信息 err = nil if b==0{ err =errors.New("b不能為0") }else { result = a/b } return }
error返回的是一般性的錯誤,但是panic函數(shù)返回的是讓程序崩潰的錯誤。
一般而言,當panic異常發(fā)生時,程序會中斷運行。
所以,我們在實際的開發(fā)過程中并不會直接調(diào)用panic( )函數(shù),但是當我們編程的程序遇到致命錯誤時,系統(tǒng)會自動調(diào)用該函數(shù)來終止整個程序的運行,也就是系統(tǒng)內(nèi)置了panic函數(shù)。
案例
package main import "fmt" func main() { test1() test2() test3() } func test1() { fmt.Println("test1") } func test2() { panic("panic test2") //程序中斷 } func test3() { fmt.Println("test3") }
結果:
test1
panic: panic test2
goroutine 1 [running]:
main.test2(...)
總結
關鍵字 defer?于延遲一個函數(shù)的執(zhí)行,調(diào)用了,但是沒有執(zhí)行,也會完成參數(shù)的傳遞
defer fmt.Println("333") defer fmt.Println("222") defer fmt.Println("111") 依次輸出順序:111,222,333
如果一個函數(shù)中有多個defer語句,它們會以后進先出的順序執(zhí)行。
注意,defer語句只能出現(xiàn)在函數(shù)的內(nèi)部。
案例1:無參數(shù)
package main import "fmt" func main() { a := 10 b := 20 defer func() { fmt.Println("匿名函數(shù)a", a) fmt.Println("匿名函數(shù)b", b) }() a = 100 b = 200 fmt.Println("main函數(shù)a", a) fmt.Println("main函數(shù)b", b) }
結果:
main函數(shù)a 100
main函數(shù)b 200
匿名函數(shù)a 100
匿名函數(shù)b 200
案例二:有參數(shù)
package main import "fmt" func main() { a := 10 b := 20 //調(diào)用了,也傳參數(shù)了,但是沒有執(zhí)行 defer func(a,b int) { //添加參數(shù) fmt.Println("匿名函數(shù)a", a) fmt.Println("匿名函數(shù)b", b) }(a,b) //傳參數(shù) a = 100 b = 200 fmt.Println("main函數(shù)a", a) fmt.Println("main函數(shù)b", b) }
結果:
main函數(shù)a 100
main函數(shù)b 200
匿名函數(shù)a 10
匿名函數(shù)b 20
運行時panic異常一旦被引發(fā)就會導致程序崩潰。這當然不是我們愿意看到的,因為誰也不能保證程序不會發(fā)生任何運行時錯誤。
Go語言為我們提供了專用于“攔截”運行時panic的內(nèi)建函數(shù)——recover。它可以是當前的程序從運行時panic的狀態(tài)中恢復并重新獲得流程控制權。
注意:recover只有在defer調(diào)用的函數(shù)中有效。
func testA() { fmt.Println("testA") } func testB(x int) { //設置recover() //在defer調(diào)用的函數(shù)中使用recover() defer func() { //防止程序崩潰 //recover() //fmt.Println(recover()) //加了一層判斷 if err:=recover();err!=nil { fmt.Println(err) } }() //匿名函數(shù) var a [3]int a[x] = 999 } func testC() { fmt.Println("testC") } func main() { testA() testB(0) //發(fā)生異常 中斷程序 testC() }
以上就是關于“GO語言中err接口及defer延遲異常怎么處理”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。