網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
錯(cuò)誤
認(rèn)識(shí)錯(cuò)誤
在Go中,錯(cuò)誤是一種表示程序錯(cuò)誤狀態(tài)。包含了在程序在運(yùn)行時(shí)、編譯時(shí)的狀態(tài)信息。一般我們?cè)诰帉?xiě)Go代碼中,都會(huì)碰到如下的處理方式。
file, err := os.Create("test.txt") fmt.Println(file) if err != nil { fmt.Println(err) return }
我們使用os庫(kù)創(chuàng)建一個(gè)名為test.txt的文件,該方法返回一個(gè)文件指針或err的錯(cuò)誤信息。
err表示文件創(chuàng)建失敗時(shí)的錯(cuò)誤信息。當(dāng)存儲(chǔ)錯(cuò)誤時(shí),我們則對(duì)程序做錯(cuò)誤處理;不存在錯(cuò)誤時(shí),則正常執(zhí)行其他的邏輯代碼。
自定義錯(cuò)誤
在Go中是允許我們自定義錯(cuò)誤信息的。自定義錯(cuò)誤信息需要利用自帶的error報(bào)中的New()函數(shù)。
如下示例代碼:
package main import ( "errors" "fmt" ) func printError() (a int, err error) { err = errors.New("打印錯(cuò)誤信息") a = 1 return } func main() { i, err := printError() fmt.Println("i value is", i) if err != nil { fmt.Println(err) return } }
具體的打印信息:??i value is 1 打印錯(cuò)誤信息?
?。
實(shí)現(xiàn)原理
在使用??errors.New()?
?函數(shù)時(shí),該包中聲明了一個(gè)結(jié)構(gòu)體??errorString?
?并且實(shí)現(xiàn)了error接口體中的方法??Error()?
?。
// errors包 package errors func New(text string) error { return &errorString{text} } type errorString struct { s string } func (e *errorString) Error() string { return e.s }
// error接口 type error interface { Error() string }
異常
認(rèn)識(shí)異常
異常是程序在??編譯時(shí)?
?或者??運(yùn)行時(shí)?
?發(fā)生的異常信息。如果不對(duì)異常做處理,可能導(dǎo)致程序終止程序或者拋出異常信息,導(dǎo)致程序無(wú)法正常運(yùn)行。不管是在程序編譯或者運(yùn)行時(shí),都需要對(duì)異常進(jìn)行嚴(yán)格處理。
如下代碼,程序在編譯時(shí)就會(huì)觸發(fā)異常,導(dǎo)致無(wú)法進(jìn)行正常編譯:
package main import "fmt" func main() { panic("print panic") fmt.Println("end") }
打印結(jié)果:
╰─ go run demo6.go
panic: print panic
goroutine 1 [running]:
main.main()
/usr/local/var/www/go/golang_code/src/syntax/err/demo6.go:20 +0x39
exit status 2
- Go 運(yùn)行時(shí)會(huì)觸發(fā)運(yùn)行時(shí) panic,伴隨著程序的崩潰拋出一個(gè) runtime.Error 接口類型的值。這個(gè)錯(cuò)誤值有個(gè) RuntimeError() 方法用于區(qū)別普通錯(cuò)誤。
- panic 可以直接從代碼初始化:當(dāng)錯(cuò)誤條件(我們所測(cè)試的代碼)很嚴(yán)苛且不可恢復(fù),程序不能繼續(xù)運(yùn)行時(shí),可以使用 panic 函數(shù)產(chǎn)生一個(gè)中止程序的運(yùn)行時(shí)錯(cuò)誤。
- panic 接收一個(gè)做任意類型的參數(shù),通常是字符串,在程序死亡時(shí)被打印出來(lái)。Go 運(yùn)行時(shí)負(fù)責(zé)中止程序并給出調(diào)試信息。
- 在多層嵌套的函數(shù)調(diào)用中調(diào)用 panic,可以馬上中止當(dāng)前函數(shù)的執(zhí)行。
處理異常
當(dāng)程序在運(yùn)行過(guò)程中發(fā)生異常,會(huì)終止程序的正常運(yùn)行。需要嚴(yán)格處理異常信息。Go中可以使用recover()將程序從panic中獲取異常信息,并獲取程序的執(zhí)行權(quán)。
- 正如名字一樣,這個(gè)(recover)內(nèi)建函數(shù)被用于從 panic 或 錯(cuò)誤場(chǎng)景中恢復(fù):讓程序可以從 panicking 重新獲得控制權(quán),停止終止過(guò)程進(jìn)而恢復(fù)正常執(zhí)行。
- recover
只能
在defer修飾的函數(shù)中使用:用于取得panic調(diào)用中傳遞過(guò)來(lái)的錯(cuò)誤值,如果是正常執(zhí)行,調(diào)用recover會(huì)返回 nil,且沒(méi)有其它效果。 - panic 會(huì)導(dǎo)致棧被展開(kāi)直到defer修飾的recover()被調(diào)用或者程序中止。
- 所有的 defer 語(yǔ)句都會(huì)保證執(zhí)行并把控制權(quán)交還給接收到 panic 的函數(shù)調(diào)用者。這樣向上冒泡直到最頂層,并執(zhí)行(每層的) defer,在棧頂處程序崩潰,并在命令行中用傳給 panic 的值報(bào)告錯(cuò)誤情況:這個(gè)終止過(guò)程就是 panicking。
異常處理原則
- 在包內(nèi)部,應(yīng)該從panic中recover:不允許顯式的超出包范圍的panic()。在包內(nèi)部,特別是在非導(dǎo)出函數(shù)中有很深層次的嵌套調(diào)用時(shí),對(duì)主調(diào)函數(shù)來(lái)說(shuō)用 panic 來(lái)表示應(yīng)該被翻譯成錯(cuò)誤的錯(cuò)誤場(chǎng)景是很有用的(并且提高了代碼可讀性)。
- 在包外部,向包的調(diào)用者返回錯(cuò)誤值(而不是panic)。
- Go 庫(kù)的原則是即使在包的內(nèi)部使用了 panic,在它的對(duì)外接口(API)中也必須用 recover 處理成返回顯式的錯(cuò)誤。
異常處理實(shí)踐
下面的示例代碼,在被調(diào)用函數(shù)printPanic()中觸發(fā)一個(gè)panic(),在main()函數(shù)中使用defer中接收panic()信息,并對(duì)panic()做異常處理。
package main import "fmt" func printPanic() { panic("panic exception") } func main() { defer func() { err := recover() if err != nil { fmt.Println("panic is", err) } }() printPanic() fmt.Println("end") }
打印結(jié)果:
╰─ go run demo5.go
i value is 1
打印錯(cuò)誤信息
原文鏈接:https://blog.51cto.com/u_10992108/5649863
相關(guān)推薦
- 2022-04-29 WPF自定義路由事件_實(shí)用技巧
- 2022-08-18 nginx之內(nèi)存池的實(shí)現(xiàn)_nginx
- 2022-06-16 C語(yǔ)言學(xué)習(xí)筆記之字符串間的那些事_C 語(yǔ)言
- 2022-10-22 C#?設(shè)置Chart的X軸為時(shí)間軸???????詳情_(kāi)C#教程
- 2023-04-19 Git 推送報(bào)錯(cuò):error: GH007: Your push would publish a p
- 2023-05-30 Python賦值邏輯的實(shí)現(xiàn)_python
- 2022-10-27 Python使用pandas將表格數(shù)據(jù)進(jìn)行處理_python
- 2022-07-04 Python繪制多因子柱狀圖的實(shí)現(xiàn)示例_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- 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)證過(guò)濾器
- Spring Security概述快速入門(mén)
- 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)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支