網(wǎng)站首頁 編程語言 正文
基本語法
異常處理是程序健壯性的關(guān)鍵,往往開發(fā)人員的開發(fā)經(jīng)驗(yàn)的多少從異常部分處理上就能得到體現(xiàn)。如何適度的添加異常,往往是整個(gè)產(chǎn)品體驗(yàn)成敗的關(guān)鍵。
Go語言中沒有Try Catch Exception機(jī)制,但是提供了panic-and-recover機(jī)制。
Panic
內(nèi)置函數(shù)panic()
類似raise,能夠停止正常的流程
當(dāng)函數(shù)內(nèi)調(diào)用panic,正常的流程將被終止,defer函數(shù)仍然會被執(zhí)行
Panic引起的原因可以是主動調(diào)用,也可以是運(yùn)行時(shí)錯(cuò)誤,例如數(shù)組越界
Recover
內(nèi)置函數(shù),用于處理panic(panicking goroutine)
在defer函數(shù)中使用有意義,正常執(zhí)行過程中,recover只會返回nil,而且沒有其他副作用
如果當(dāng)前Goroutine(后面講到并發(fā)時(shí)會重點(diǎn)講解,這里就是理解成程序的執(zhí)行過程中)發(fā)生panicking,將自動捕獲panic值給recover,同時(shí)恢復(fù)正常執(zhí)行
示例一:recover()使用方法
本示例主要說明如何捕獲異常,先來模擬一種異常情況,在一些項(xiàng)目中,經(jīng)常有數(shù)組下標(biāo)越界的情況,我們來人為構(gòu)造一下
package main import "fmt" func MyPanic() { fmt.Println("Running in MyPanic...") var a[]int a[3] = 5 } func main() { MyPanic() }
此時(shí)運(yùn)行程序,很明顯會出現(xiàn)如下問題:
Running in MyPanic...
panic: runtime error: index out of range [3] with length 0
goroutine 1 [running]:
main.MyPanic()
?? ?/root/workspace/go/test_panic_recover_basic.go:14 +0x5e
main.main()
?? ?/root/workspace/go/test_panic_recover_basic.go:18 +0x17
exit status 2
嘗試用recover進(jìn)行異常處理
package main import "fmt" func MyPanic() { defer func() { if x := recover(); x != nil { fmt.Printf("[ERROR]: My panic handle error: %s\n", x) } }() fmt.Println("Running in MyPanic...") var a[]int a[3] = 5 } func main() { MyPanic() }
就上面的代碼進(jìn)行一下分析:
首先增加了一個(gè)defer函數(shù)
在defer中,使用x := recover(); x != nil方式捕獲異常,如果獲取的值不為空,則證明有異常發(fā)生
獲取異常信息時(shí),直接用剛剛的變量就可以輸出詳細(xì)的錯(cuò)誤信息,執(zhí)行結(jié)果如下所示
Running in MyPanic...
[ERROR]: My panic handle error: runtime error: index out of range [3] with length 0
實(shí)例二:panic()使用方法
本示例除了介紹panic(),還實(shí)現(xiàn)了一種統(tǒng)一的ErrorHandler方法(有點(diǎn)像Python中的裝飾器),來統(tǒng)一處理函數(shù)的異常
package main import "fmt" func ErrorHandler(f func()) (b bool) { defer func() { if x := recover(); x != nil { fmt.Printf("[ERROR]Handle error here: %s\n", x) b = true } }() f() return } func CallPanic() { panic("Call panic") } func main() { fmt.Println(ErrorHandler(CallPanic)) }
我們來對代碼進(jìn)行一下分析:
定義了兩個(gè)函數(shù),一個(gè)是CallPanic()產(chǎn)生異常,一個(gè)是ErrorHandler()來捕獲所有函數(shù)的異常
CallPanic()邏輯很簡單,就是用panic()內(nèi)置函數(shù)產(chǎn)生異常,后面的參數(shù)就是異常的具體內(nèi)容
ErrorHandler的參數(shù)是一個(gè)函數(shù),也就是利用函數(shù)作為值的特性,而返回值為bool類型
ErrorHandler中對于異常捕獲與示例一種相同,利用defer函數(shù)完成,而在函數(shù)體內(nèi),執(zhí)行被調(diào)用的函數(shù)f()
從執(zhí)行結(jié)果來看,ErrorHandler中輸出了Call panic的異常和返回結(jié)果true
原文鏈接:https://blog.csdn.net/xiaoquqi/article/details/125729724
相關(guān)推薦
- 2023-12-19 Cannot resolve symbol異常產(chǎn)生原因及解決方案
- 2023-06-17 Python利用plotly繪制正二十面體詳解_python
- 2022-07-01 Android?TextView跑馬燈實(shí)現(xiàn)原理及方法實(shí)例_Android
- 2022-02-01 es ik分詞插件安裝
- 2022-11-11 詳解React?Native項(xiàng)目中啟用Hermes引擎_React
- 2022-12-09 C++中使用cout以hex格式輸出方式_C 語言
- 2022-07-29 Linux文件管理方法介紹_linux shell
- 2022-11-27 使用Docker搭建Apache?Kafka環(huán)境的詳細(xì)過程_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支