亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

解鎖即可觀看《Go開發工程師》完整課程視頻

Go開發工程師

未來3-5年企業高性能項目不可替代的語言,從基礎到項目實戰再到重構,真正從入門到精通

【第1周】Go基礎知識入門
【第2周】容器,go編程思想
【第3周】Go并發編程和工程管理
【第4周】從0開始理解rpc和grpc
【第5周】grpc和protobuf進階
【第6周】 yapi文檔管理、gorm詳解
【第7周】gin快速入門
【第8周】用戶服務的grpc服務
【第9周】用戶服務的web服務
【第10周】服務注冊/發現、配置中心、負載均衡
【第11周】商品微服務的grpc服務
【第12周】 商品微服務的gin層和oss圖片服務
【第13周】庫存服務和分布式鎖
【第14周】訂單和購物車微服務
【第15周】 支付寶支付、用戶操作微服務、前后端聯調
【第16周】elasticsearch實現搜索微服務
【第17周】 分布式理論基礎、分布式事務解決方案
【第18周】 學習rocketmq實現冪等性機制等
【第19周】鏈路追蹤、限流、熔斷、降級
【第20周】api網關、部署
【第21周】開發規范和go基礎擴展
【第22周】設計模式和單元測試
【第23周】protoc插件開發、cobra命令行
【第24周】log日志包設計
【第25周】ast代碼生成工具開發
【第26周】三層代碼結構
【第27周】grpc服務封裝更方便的rpc服務
【第28周】深入grpc的服務注冊、負載均衡原理
【第29周】基于gin封裝api服務
【第30周】可觀測的終極解決方案
【第31周】系統監控核心
【第32周】用戶、商品服務重構
【第33周】訂單、庫存等服務重構
【第33+周】訂單服務重構、wire進行ioc控制
【第34周】通過k8s部署服務
【第34+周】devops和k8s
章節
問答
課簽
筆記
評論
占位
占位

Go語言異常處理——panic

    在上一節,我們已經了解到了足夠多的error接口及其周邊的知識。現在,是學習另外一種異常處理方式的時候了。先來展示一個名詞——panicpanic可被意譯為運行時恐慌。因為它只有在程序運行的時候才會被“拋出來”。并且,恐慌是會被擴散的。當有運行時恐慌發生時,它會被迅速地向調用棧的上層傳遞。如果我們不顯式地處理它的話,程序的運行瞬間就會被終止。這里有一個專有名詞——程序崩潰。內建函數panic可以讓我們人為地產生一個運行時恐慌。不過,這種致命錯誤是可以被恢復的。在Go語言中,內建函數recover就可以做到這一點。
  
    實際上,內建函數panicrecover是天生的一對。前者用于產生運行時恐慌,而后者用于“恢復”它。不過要注意,recover函數必須要在defer語句中調用才有效。因為一旦有運行時恐慌發生,當前函數以及在調用棧上的所有代碼都是失去對流程的控制權。只有defer語句攜帶的函數中的代碼才可能在運行時恐慌迅速向調用棧上層蔓延時“攔截到”它。這里有一個可以起到此作用的defer語句的示例:

defer func() {
    if p := recover(); p != nil {
        fmt.Printf("Fatal error: %s\n", p)
    }
}()

    在這條defer語句中,我們調用了recover函數。該函數會返回一個interface{}類型的值。還記得嗎?interface{}代表空接口。Go語言中的任何類型都是它的實現類型。我們把這個值賦給了變量p。如果p不為nil,那么就說明當前確有運行時恐慌發生。這時我們需根據情況做相應處理。注意,一旦defer語句中的recover函數調用被執行了,運行時恐慌就會被恢復,不論我們是否進行了后續處理。所以,我們一定不要只“攔截”不處理。
  
    我們下面來反觀panic函數。該函數可接受一個interface{}類型的值作為其參數。也就是說,我們可以在調用panic函數的時候可以傳入任何類型的值。不過,我建議大家在這里只傳入error類型的值。這樣它表達的語義才是精確的。更重要的是,當我們調用recover函數來“恢復”由于調用panic函數而引發的運行時恐慌的時候,得到的值正是調用后者時傳給它的那個參數。因此,有這樣一個約定是很有必要的。
  
    總之,運行時恐慌代表程序運行過程中的致命錯誤。我們只應該在必要的時候引發它。人為引發運行時恐慌的方式是調用panic函數。recover函數是我們常會用到的。因為在通常情況下,我們肯定不想因為運行時恐慌的意外發生而使程序崩潰。最后,在“恢復”運行時恐慌的時候,大家一定要注意處理措施的得當。

任務

    命令源碼文件index.go中有三個函數:mainouterFuncinnerFunc。在innerFunc函數中,我準備通過調用panic函數引發一個運行時恐慌。請你在文件中的適當位置添加一條defer語句,以使得該運行時恐慌得到“恢復”。并且,該文件的運行應該使標準輸出上打印出:

Enter main
Enter outerFunc
Enter innerFunc
Fatal error: Occur a panic!
?不會了怎么辦

應該在main函數的開始處添加:

defer func() {
    if p := recover(); p != nil {
        fmt.Printf("Fatal error: %s\n", p)
    }
}()
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?