<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Go語言引入了一個關於錯誤處理的標準模式,即error介面,它是Go語言內建的介面型別,該介面的定義如下:
type error interface { Error() string }
呼叫對應介面
err:=errors.New("this is normal err") fmt.Println(err.Error()) err2:=fmt.Errorf("this is normal err") fmt.Println(err2)
案例:除數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函數返回的是讓程式崩潰的錯誤。
一般而言,當panic異常發生時,程式會中斷執行。
所以,我們在實際的開發過程中並不會直接呼叫panic( )函數,但是當我們程式設計的程式遇到致命錯誤時,系統會自動呼叫該函數來終止整個程式的執行,也就是系統內建了panic函數。
案例
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⽤於延遲一個函數的執行,呼叫了,但是沒有執行,也會完成引數的傳遞
defer fmt.Println("333") defer fmt.Println("222") defer fmt.Println("111") 依次輸出順序:111,222,333
如果一個函數中有多個defer語句,它們會以後進先出的順序執行。
注意,defer語句只能出現在函數的內部。
案例1:無引數
package main import "fmt" func main() { a := 10 b := 20 defer func() { fmt.Println("匿名函數a", a) fmt.Println("匿名函數b", b) }() a = 100 b = 200 fmt.Println("main函數a", a) fmt.Println("main函數b", b) }
結果:
main函數a 100
main函數b 200
匿名函數a 100
匿名函數b 200
案例二:有引數
package main import "fmt" func main() { a := 10 b := 20 //呼叫了,也傳引數了,但是沒有執行 defer func(a,b int) { //新增引數 fmt.Println("匿名函數a", a) fmt.Println("匿名函數b", b) }(a,b) //傳引數 a = 100 b = 200 fmt.Println("main函數a", a) fmt.Println("main函數b", b) }
結果:
main函數a 100
main函數b 200
匿名函數a 10
匿名函數b 20
執行時panic異常一旦被引發就會導致程式崩潰。這當然不是我們願意看到的,因為誰也不能保證程式不會發生任何執行時錯誤。
Go語言為我們提供了專用於“攔截”執行時panic的內建函數——recover。它可以是當前的程式從執行時panic的狀態中恢復並重新獲得流程控制權。
注意:recover只有在defer呼叫的函數中有效。
func testA() { fmt.Println("testA") } func testB(x int) { //設定recover() //在defer呼叫的函數中使用recover() defer func() { //防止程式崩潰 //recover() //fmt.Println(recover()) //加了一層判斷 if err:=recover();err!=nil { fmt.Println(err) } }() //匿名函數 var a [3]int a[x] = 999 } func testC() { fmt.Println("testC") } func main() { testA() testB(0) //發生異常 中斷程式 testC() }
以上就是GO語言中err介面及defer延遲例外處理分析的詳細內容,更多關於GO語言err介面defer延遲異常的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45