Golang——error处理及panic、recover使用的正确姿势
生活随笔
收集整理的這篇文章主要介紹了
Golang——error处理及panic、recover使用的正确姿势
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
異常就是程序出現了不正常的情況,會導致程序非正常停止,而異常處理就是針對非正常停止的情況,給出異常時的處理方式。語法錯誤不算異常體系中
error:
- error是一個接口,作用是返回程序異常的信息,errors實現了error
- 創建error使用errors.New()可以定義異常信息
- 如果將error作為返回值的話,要放在返回值列表的最后
演示:
package mainimport ("errors""fmt" )func TestError(num1, num2 int) (result int, err error) {err = nilif num1 == 0 || num2 == 0 {fmt.Println("除數不能為0")return}result = num1 / num2return }func main() {num, err := TestError(10, 1)if err != nil {err = errors.New("除數不能為0")} else {fmt.Println(num)} }標準庫將error定義為接口類型,以便于實現自定義錯誤類型
type error interface { Error() string }error是最后一個返回參數。標準庫提供了相關創建函數, 含簡單錯誤文本的error對象,應通過變量實例,而非文本內容來判定錯誤類別
func main() {z, err := div(5, 0)if err == errDivByZero {log.Fatalln(err)}println(z) }var errDivByZero = errors.New("division by zero")func div(x, y int) (int, error) {if y == 0 {return 0, errDivByZero}return x / y, nil }錯誤變量通常以err作為前綴,且字符串內容全部小寫,沒有結束標點,以便于嵌入到其他格式化字符串中輸出。與errors.New類似的還有fmt.Errorf,它返回一個格式化內容的錯誤對象。某些時候,我們需要自定義錯誤類型,以便容納更多上下文狀態信息。如此,還可基于類 型做出判斷
func main() {z, err := div(5, 0)if err != nil {switch e := err.(type) { // 根據類型匹配case DivError:fmt.Println(e, e.x, e.y)default:fmt.Println(e)}log.Fatalln(err)}println(z) }type DivError struct {x, y int }//自定義錯誤類型。 func (DivError) Error() string {return "division by zero" }//實現error接口方法。 func div(x, y int) (int, error) {if y == 0 {return 0, DivError{x, y}}//返回自定義錯誤類型。return x / y, nil }- 自定義錯誤類型通常以Error為后綴。在用switch按類型匹配時,注意case順序。應將自定義類型放在前面,優先匹配具體錯誤類型
- 在寫代碼中,我們不能忽略error返回值,應做嚴格檢查,否則可能會導致錯誤的邏輯狀態。調用多返回值函數時,除error外,其他返回值同樣需要關注。以os.File.Read方法為例,它會同時返回剩余內容和EOF。 可用Linter檢查代碼里的unchecked error
大量函數和方法返回error,這使得調用代碼變得很難看,一堆堆的檢查語句充斥在代碼行間。解決思路有:
- 使用專門的checkError函數處理錯誤邏輯(比如記錄日志),以此簡化檢查代碼
- 在不影響邏輯的情況下,使用defer延后處理錯誤狀態(err退化賦值)
- 在不中斷邏輯的情況下,將錯誤作為內部狀態保存,最終提交時再處理
panic與recover:
panic是內置函數,可以終止程序,會立即中斷當前函數流程,觸發執行延遲調用
recover可以攔截panic異常信息,但是recover不可以直接調用,并且只有在defer調用的函數中有效
如果是放在循環中了,連續調用panic,僅最后一個會被recover捕耕
func main() {defer func() {if err := recover(); err != nil { // 捕捉錯誤log.Fatalln(err)}}()panic("我掛了") // 引發錯誤fmt.Println("會走這一步嗎") // 不會執行,編譯器也會提示這是一個永遠不會執行的代碼 }除非是不可恢復性,導致系統無法正常工作的錯誤,否則不建議使用Panic
例如:文件系統沒有操作權限,服務端口被占用,數據庫未啟動等情況
總結
以上是生活随笔為你收集整理的Golang——error处理及panic、recover使用的正确姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中scanner与hashmap
- 下一篇: 修改form_Vue通过阿里云oss的u