網站首頁 編程語言 正文
錯誤
認識錯誤
在Go中,錯誤是一種表示程序錯誤狀態。包含了在程序在運行時、編譯時的狀態信息。一般我們在編寫Go代碼中,都會碰到如下的處理方式。
file, err := os.Create("test.txt") fmt.Println(file) if err != nil { fmt.Println(err) return }
我們使用os庫創建一個名為test.txt的文件,該方法返回一個文件指針或err的錯誤信息。
err表示文件創建失敗時的錯誤信息。當存儲錯誤時,我們則對程序做錯誤處理;不存在錯誤時,則正常執行其他的邏輯代碼。
自定義錯誤
在Go中是允許我們自定義錯誤信息的。自定義錯誤信息需要利用自帶的error報中的New()函數。
如下示例代碼:
package main import ( "errors" "fmt" ) func printError() (a int, err error) { err = errors.New("打印錯誤信息") 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 打印錯誤信息?
?。
實現原理
在使用??errors.New()?
?函數時,該包中聲明了一個結構體??errorString?
?并且實現了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 }
異常
認識異常
異常是程序在??編譯時?
?或者??運行時?
?發生的異常信息。如果不對異常做處理,可能導致程序終止程序或者拋出異常信息,導致程序無法正常運行。不管是在程序編譯或者運行時,都需要對異常進行嚴格處理。
如下代碼,程序在編譯時就會觸發異常,導致無法進行正常編譯:
package main import "fmt" func main() { panic("print panic") fmt.Println("end") }
打印結果:
╰─ 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 運行時會觸發運行時 panic,伴隨著程序的崩潰拋出一個 runtime.Error 接口類型的值。這個錯誤值有個 RuntimeError() 方法用于區別普通錯誤。
- panic 可以直接從代碼初始化:當錯誤條件(我們所測試的代碼)很嚴苛且不可恢復,程序不能繼續運行時,可以使用 panic 函數產生一個中止程序的運行時錯誤。
- panic 接收一個做任意類型的參數,通常是字符串,在程序死亡時被打印出來。Go 運行時負責中止程序并給出調試信息。
- 在多層嵌套的函數調用中調用 panic,可以馬上中止當前函數的執行。
處理異常
當程序在運行過程中發生異常,會終止程序的正常運行。需要嚴格處理異常信息。Go中可以使用recover()將程序從panic中獲取異常信息,并獲取程序的執行權。
- 正如名字一樣,這個(recover)內建函數被用于從 panic 或 錯誤場景中恢復:讓程序可以從 panicking 重新獲得控制權,停止終止過程進而恢復正常執行。
- recover
只能
在defer修飾的函數中使用:用于取得panic調用中傳遞過來的錯誤值,如果是正常執行,調用recover會返回 nil,且沒有其它效果。 - panic 會導致棧被展開直到defer修飾的recover()被調用或者程序中止。
- 所有的 defer 語句都會保證執行并把控制權交還給接收到 panic 的函數調用者。這樣向上冒泡直到最頂層,并執行(每層的) defer,在棧頂處程序崩潰,并在命令行中用傳給 panic 的值報告錯誤情況:這個終止過程就是 panicking。
異常處理原則
- 在包內部,應該從panic中recover:不允許顯式的超出包范圍的panic()。在包內部,特別是在非導出函數中有很深層次的嵌套調用時,對主調函數來說用 panic 來表示應該被翻譯成錯誤的錯誤場景是很有用的(并且提高了代碼可讀性)。
- 在包外部,向包的調用者返回錯誤值(而不是panic)。
- Go 庫的原則是即使在包的內部使用了 panic,在它的對外接口(API)中也必須用 recover 處理成返回顯式的錯誤。
異常處理實踐
下面的示例代碼,在被調用函數printPanic()中觸發一個panic(),在main()函數中使用defer中接收panic()信息,并對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") }
打印結果:
╰─ go run demo5.go
i value is 1
打印錯誤信息
原文鏈接:https://blog.51cto.com/u_10992108/5649863
相關推薦
- 2022-11-15 Python+?Flask實現Mock?Server詳情_python
- 2022-10-31 一文搞懂Go語言操作Redis的方法_Golang
- 2022-09-15 C#?彈出窗口show()和showdialog()的兩種方式_C#教程
- 2022-07-21 C#?PDF轉圖片(JPG,Png)的項目實踐_C#教程
- 2022-07-28 Python?datacompy?找出兩個DataFrames不同的地方_python
- 2022-05-28 Nginx實現Nacos反向代理的項目實踐_nginx
- 2023-04-19 Android.bp語法和使用方法講解_Android
- 2024-03-21 【Spring Boot】Spring Boot 配置文件詳解(application.yml、ap
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支