亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Golang try catch與錯誤處理的實現

Golang try catch與錯誤處理的實現

熱門標簽:上海企業外呼系統排名 開通400電話申請流程 400手機電話免費辦理 揚州電銷外呼系統軟件 百度地圖標注位置網站 武漢百應人工智能電銷機器人 智能語音電銷的機器人 電腦外呼系統輻射大嗎 如何利用高德地圖標注家

Golang try catch

雖然在使用Golang的時候發現沒有try catch這種錯誤處理機制但是想一想golang作為一門優雅的語言,似乎也是情理之中。因為在java中 throws在函數簽名中有一個關鍵字,旨在使異常流程比較簡潔,但是一旦預期的異常數量增加,就很難準確捕捉到具體異常所在。

雖然golang中并不提供try catch的寫法但是零值概念啊等等一些設計,在加上在panic的時候還可以使用recover進行處理,我覺得還是可以接受的。

在進入正題之前我們還是需要新了解一下panic和recover和error

panic

golang新手特別喜歡將panic當作exception(我也是這么過來的。。),而這么做會導致panic被濫用。

panic主要使用場景:

  • 發生嚴重錯誤必須讓進行退出,嚴重的判斷標準是錯誤無法恢復導致程序無法執行或繼續執行或者繼續執行也得不到預定的結果,另一些場景就是程序啟動需要的初始化數據需要在數據庫中讀取,這個時候數據庫無法讀取或者不存在配置項不可讀取,這個時候哪怕是執行下去程序也是毫無意義的,這個時候panic暴露出問題反而是更可取的方式。非嚴重的錯誤比如客戶端不合法的請求參數返回錯誤參數信息提示即可,讓調用者自己去處理問題,而不是自己panic掛掉。
  • 快速退出錯誤處理。也就是下面需要模擬的try catch的行為。大多數情況下錯誤處理都應該使用判斷error的機制,但是有時函數調用棧很深,逐層返回錯誤可能需要寫很多冗余代碼,這個時候可以使用panic讓程序的控制流直接跳到頂層的recover來進行處理。這種場景需要注意必須在包內就要recover。讓panic垮包傳遞可能會導致更復雜的問題,所以包的到處函數不應該產生panic。

recover

func recover() interface{}

 recover 是一個內建的函數,用于重新獲得 panic 協程的控制。 只有在延遲函數的內部,調用 recover 才有用。在延遲函數內調用 recover,可以取到 panic 的錯誤信息,并且停止 panic 續發事件(Panicking Sequence),程序運行恢復正常。如果在延遲函數的外部調用 recover,就不能停止 panic 續發事件。

error

golang中內置的錯誤類型error是一個接口,自定義的錯誤類型必須實現error接口,這樣調用可以通過Error()獲取到具體的錯誤信息而不用關系錯誤的具體類型。

// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
 Error() string
}

 很多語言限制函數只能有一個返回值,這就顯得尤為寶貴,而golang的多返回值語法糖避免了這種方式帶來的不便,錯誤值一般作為返回值列表的最后一個,其他返回值是成功執行時需要返回的信息。也就衍生出了如下判斷:

if err != nil {
    // error handling
} else {
    // normal code
}

雖然這種錯誤處理方式代碼寫起來很蛋疼,但是golang風格確實推薦使用此種方式。

預定義錯誤值

var numIsZero = errors.New("num1 is zero")
var numIsNotZero = errors.New("num1 is not zero")
 
func GetInt(num1 int) (int, error) {
 if num1 == 0 {
  return num1, numIsZero
 } else {
  return num1, numIsNotZero
 }
}
 
//比較錯誤
func ErrEquals() {
 _, err := GetInt(1)
 if err == numIsNotZero {
   
 }
}

自定義錯誤類型

HTTP 表示客戶端的錯誤狀態碼有幾十個。如果為每種狀態碼都預定義相應的錯誤值,代碼會變得很繁瑣:

var ErrBadRequest = errors.New("status code 400: bad request")
var ErrUnauthorized = errors.New("status code 401: unauthorized")

這種場景下最佳的最法是自定義一種錯誤類型,并且至少實現 Error() 方法(滿足 error 定義):

type HTTPError struct {
    Code        int
    Description string
}
 
func (h *HTTPError) Error() string {
    return fmt.Sprintf("status code %d: %s", h.Code, h.Description)
}

這種方式下進行等值判斷時需要轉成具體的自定義類型然后取出 Code 字段判斷:

func request() error {
    return HTTPError{404, "not found"}
}
 
func main() {
    err := request()
 
    if err != nil {
        // an error occured
        if err.(*HTTPError).Code == 404 {
            // handle a "not found" error
        } else {
            // handle a different error
        }
    }
 
}

使用 panic和recover模擬 tyr catch  謹慎!

tyr catch 需要謹慎使用,因為panic / recover 和 try / catch 機制最大的不同在于控制流程上的區別。try / catch 機制控制流作用在 try 代碼塊內,代碼塊執行到異常拋出點(throw)時,控制流跳出 try 代碼塊,轉到對應的 catch 代碼塊,然后繼續往下執行。panic / recover 機制控制流則作用在整個 goroutine 的調用棧。當 goroutine 執行到 panic 時,控制流開始在當前 goroutine 的調用棧內向上回溯(unwind)并執行每個函數的 defer 。如果 defer 中遇到 recover 則回溯停止,如果執行到 goroutine 最頂層的 defer 還沒有 recover ,運行時就輸出調用棧信息然后退出。所以如果要使用 recover 避免 panic 導致進程掛掉,recover 必須要放到 defer 里。為了避免過于復雜的代碼,最好不要使用嵌套的 defer ,并且 recover 應該直接放到 defer 函數里直接調用。

package main
 
import (
 "fmt"
)
 
func main() {
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("error:", err)
  }
 }()
 
 fmt.Println("start")
 panic("Big Error")
 fmt.Println("stop")
}

輸出:

start
error: Big Error

此部分的代碼相當于try部分的代碼一旦被panic 后面的代碼就不會被執行了,而是跳到 defer部分

       fmt.Println("start")
 panic("Big Error")
 fmt.Println("stop")

 接收到錯誤并處理相當于catch:

defer func() {
  if err := recover(); err != nil {
   fmt.Println("error:", err)
  }
 }()

注意如果想再次catch需要按照從下往上的循序進行異常處理,原因的話了解defer。:

func main() {
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("error:", err)
  }
 }()
 
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("再次panic")
   panic(err)
  }
 }()
 
 fmt.Println("start")
 panic("Big Error")
 fmt.Println("stop")
}
func main() {
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("error:", err)
  }
 }()
 
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("再次panic")
   panic(err)
  }
 }()
 
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("再次panic")
   panic(err)
  }
 }()
 
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("再次panic")
   panic(err)
  }
 }()
 
 fmt.Println("start")
 panic("Big Error")
 fmt.Println("stop")
}

輸出:

start
再次panic
再次panic
再次panic
error: Big Error

到此這篇關于Golang try catch與錯誤處理的實現的文章就介紹到這了,更多相關Golang try catch與錯誤處理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang中重復錯誤處理的優化方法
  • Golang巧用defer進行錯誤處理的方法
  • golang 語言中錯誤處理機制

標簽:江西 武漢 張掖 宜賓 黑龍江 新余 延邊 嘉峪關

巨人網絡通訊聲明:本文標題《Golang try catch與錯誤處理的實現》,本文關鍵詞  Golang,try,catch,與,錯誤,處理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang try catch與錯誤處理的實現》相關的同類信息!
  • 本頁收集關于Golang try catch與錯誤處理的實現的相關信息資訊供網民參考!
  • 推薦文章
    天天做日日爱| 韩国毛片| 九九久久99综合一区二区| 国产网站免费| 成人免费网站视频ww| 欧美激情伊人| 四虎论坛| 九九干| 国产一区二区精品尤物| 欧美激情一区二区三区在线| 欧美大片aaaa一级毛片| 久久精品店| 亚洲精品中文字幕久久久久久| 高清一级做a爱过程不卡视频| 国产成人女人在线视频观看 | 四虎影视精品永久免费网站 | 国产国语对白一级毛片| 国产麻豆精品| 黄视频网站在线观看| 国产不卡高清| 久久久成人网| 香蕉视频久久| 亚洲爆爽| 二级片在线观看| 欧美激情一区二区三区在线 | 国产激情一区二区三区| 国产网站免费观看| 韩国三级视频在线观看| 久久久久久久免费视频| 欧美另类videosbestsex久久| 黄色免费三级| 精品国产一级毛片| 日韩一级精品视频在线观看| 日韩一级精品视频在线观看| 人人干人人草| 久久99欧美| 精品国产一区二区三区久久久蜜臀| 亚洲 欧美 91| 99热热久久| 一级毛片看真人在线视频| 黄色免费网站在线| 精品视频在线看| 日本在线不卡免费视频一区| 国产不卡福利| 久久成人亚洲| 成人a级高清视频在线观看| 精品视频在线观看免费| 国产精品1024在线永久免费| 精品毛片视频| 日韩综合| 韩国三级视频网站| 欧美激情一区二区三区视频 | 免费国产在线观看不卡| 国产一区二区精品尤物| 九九干| 九九免费精品视频| 999精品在线| 一级毛片视频播放| 精品国产一区二区三区国产馆| 午夜在线影院| 九九免费精品视频| 中文字幕一区二区三区精彩视频| 日韩中文字幕一区二区不卡| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品久久久久久综合网| 欧美大片一区| 国产综合成人观看在线| 一级女性大黄生活片免费| 成人影视在线播放| 毛片电影网| a级毛片免费观看网站| 国产一区二区精品久久91| 成人免费网站视频ww| a级黄色毛片免费播放视频| 黄色免费三级| 欧美激情一区二区三区中文字幕| 精品久久久久久中文| 国产成人啪精品| 韩国三级视频网站| 麻豆污视频| 欧美一级视频高清片| 色综合久久天天综合| 国产综合91天堂亚洲国产| 香蕉视频三级| 四虎影视久久| 尤物视频网站在线观看| 国产成人女人在线视频观看| 精品国产一区二区三区免费 | 色综合久久手机在线| 色综合久久手机在线| 毛片高清| 尤物视频网站在线观看| 美女免费毛片| 麻豆系列 在线视频| 日韩中文字幕在线亚洲一区 | 台湾毛片| 国产一区二区精品在线观看| 国产一区二区精品久久91| 日本免费乱人伦在线观看| 韩国三级视频网站| 欧美另类videosbestsex久久| 日本免费乱理伦片在线观看2018| 欧美激情伊人| 精品久久久久久中文| 久久99欧美| 亚洲精品久久玖玖玖玖| 精品毛片视频| 九九久久国产精品大片| 国产精品自拍亚洲| 国产视频久久久久| 99久久网站| 日日爽天天| 一级女性大黄生活片免费| 国产麻豆精品| 麻豆午夜视频| 欧美一区二区三区在线观看| 亚洲精品中文一区不卡| 黄视频网站在线免费观看| 午夜激情视频在线观看 | 91麻豆精品国产自产在线观看一区| 日韩一级精品视频在线观看| 欧美爱爱网| 香蕉视频久久| 久久精品道一区二区三区| 韩国三级一区| 日本在线播放一区| 日韩在线观看免费| 中文字幕一区二区三区 精品| 免费国产一级特黄aa大片在线| 天堂网中文在线| 高清一级淫片a级中文字幕| 亚洲 国产精品 日韩| 一 级 黄 中国色 片| 亚洲女初尝黑人巨高清在线观看| 国产麻豆精品hdvideoss| 999久久66久6只有精品| 成人免费一级纶理片| 久久成人亚洲| 成人免费网站视频ww| 日韩在线观看免费完整版视频| 欧美一区二区三区在线观看| 色综合久久天天综合| 天天色成人| 欧美电影免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩专区在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 成人影视在线观看| 日日爽天天| 久久福利影视| 精品视频在线看| 91麻豆精品国产自产在线| 成人影院一区二区三区| 国产精品自拍在线观看| 日韩免费在线视频| 国产一级强片在线观看| 国产精品自拍一区| 国产韩国精品一区二区三区| 99热精品在线| 欧美大片一区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久福利影视| 国产视频一区二区在线观看| 色综合久久久久综合体桃花网| 九九久久99| 精品国产香蕉伊思人在线又爽又黄| 国产亚洲精品aaa大片| 国产亚洲精品成人a在线| 久久精品大片| 国产成人女人在线视频观看 | 国产福利免费观看| 国产伦久视频免费观看 视频| 一级毛片视频播放| 一本伊大人香蕉高清在线观看| 欧美电影免费看大全| 一级毛片看真人在线视频| 青青青草影院 | 美女被草网站| 欧美激情中文字幕一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲天堂免费观看| 99久久视频| 成人高清免费| 亚洲第一页色| 精品国产一区二区三区国产馆| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美日本韩国| 国产伦理精品| 午夜激情视频在线观看 | 国产麻豆精品免费视频| 久久精品免视看国产成人2021| 精品国产一区二区三区精东影业| 99热精品一区| 99久久精品国产麻豆| 欧美国产日韩精品| 国产麻豆精品高清在线播放| 国产91素人搭讪系列天堂| 国产视频一区在线| 亚洲女人国产香蕉久久精品| 国产伦精品一区三区视频|