婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)

Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)

熱門標(biāo)簽:上海企業(yè)外呼系統(tǒng)排名 開通400電話申請流程 400手機(jī)電話免費(fèi)辦理 揚(yáng)州電銷外呼系統(tǒng)軟件 百度地圖標(biāo)注位置網(wǎng)站 武漢百應(yīng)人工智能電銷機(jī)器人 智能語音電銷的機(jī)器人 電腦外呼系統(tǒng)輻射大嗎 如何利用高德地圖標(biāo)注家

Golang try catch

雖然在使用Golang的時(shí)候發(fā)現(xiàn)沒有try catch這種錯(cuò)誤處理機(jī)制但是想一想golang作為一門優(yōu)雅的語言,似乎也是情理之中。因?yàn)樵趈ava中 throws在函數(shù)簽名中有一個(gè)關(guān)鍵字,旨在使異常流程比較簡潔,但是一旦預(yù)期的異常數(shù)量增加,就很難準(zhǔn)確捕捉到具體異常所在。

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

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

panic

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

panic主要使用場景:

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

recover

func recover() interface{}

 recover 是一個(gè)內(nèi)建的函數(shù),用于重新獲得 panic 協(xié)程的控制。 只有在延遲函數(shù)的內(nèi)部,調(diào)用 recover 才有用。在延遲函數(shù)內(nèi)調(diào)用 recover,可以取到 panic 的錯(cuò)誤信息,并且停止 panic 續(xù)發(fā)事件(Panicking Sequence),程序運(yùn)行恢復(fù)正常。如果在延遲函數(shù)的外部調(diào)用 recover,就不能停止 panic 續(xù)發(fā)事件。

error

golang中內(nèi)置的錯(cuò)誤類型error是一個(gè)接口,自定義的錯(cuò)誤類型必須實(shí)現(xiàn)error接口,這樣調(diào)用可以通過Error()獲取到具體的錯(cuò)誤信息而不用關(guān)系錯(cuò)誤的具體類型。

// 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
}

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

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

雖然這種錯(cuò)誤處理方式代碼寫起來很蛋疼,但是golang風(fēng)格確實(shí)推薦使用此種方式。

預(yù)定義錯(cuò)誤值

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
 }
}
 
//比較錯(cuò)誤
func ErrEquals() {
 _, err := GetInt(1)
 if err == numIsNotZero {
   
 }
}

自定義錯(cuò)誤類型

HTTP 表示客戶端的錯(cuò)誤狀態(tài)碼有幾十個(gè)。如果為每種狀態(tài)碼都預(yù)定義相應(yīng)的錯(cuò)誤值,代碼會(huì)變得很繁瑣:

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

這種場景下最佳的最法是自定義一種錯(cuò)誤類型,并且至少實(shí)現(xiàn) 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)
}

這種方式下進(jìn)行等值判斷時(shí)需要轉(zhuǎn)成具體的自定義類型然后取出 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  謹(jǐn)慎!

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

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

此部分的代碼相當(dāng)于try部分的代碼一旦被panic 后面的代碼就不會(huì)被執(zhí)行了,而是跳到 defer部分

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

 接收到錯(cuò)誤并處理相當(dāng)于catch:

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

注意如果想再次catch需要按照從下往上的循序進(jìn)行異常處理,原因的話了解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

到此這篇關(guān)于Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang try catch與錯(cuò)誤處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang中重復(fù)錯(cuò)誤處理的優(yōu)化方法
  • Golang巧用defer進(jìn)行錯(cuò)誤處理的方法
  • golang 語言中錯(cuò)誤處理機(jī)制

標(biāo)簽:江西 武漢 張掖 宜賓 黑龍江 新余 延邊 嘉峪關(guān)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)》,本文關(guān)鍵詞  Golang,try,catch,與,錯(cuò)誤,處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang try catch與錯(cuò)誤處理的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美调教femdomvk| 另类人妖一区二区av| 日本少妇一区二区| 夜夜嗨av一区二区三区中文字幕| 日韩欧美在线123| 精品99一区二区| 亚洲一区二区三区视频在线播放| 亚洲欧洲美洲综合色网| 日韩在线a电影| 成人黄色在线网站| 欧美性猛片xxxx免费看久爱| 久久综合久久综合久久综合| 亚洲欧美成人一区二区三区| 国产精品资源在线观看| 国产无一区二区| 亚洲高清免费在线| 91麻豆精品国产自产在线 | 精品国产一区二区三区四区四| 亚洲宅男天堂在线观看无病毒| 丰满岳乱妇一区二区三区| 久久久91精品国产一区二区精品 | 国产一区福利在线| 久久久久国产精品麻豆ai换脸| 狠狠色综合播放一区二区| 亚洲一区二区三区在线看| 国产精品二区一区二区aⅴ污介绍| 国产在线不卡一卡二卡三卡四卡| 日韩欧美在线1卡| 免费成人在线网站| 精品福利在线导航| 色婷婷综合久久久中文一区二区 | 7799精品视频| 亚洲色图欧美激情| 91精品国产综合久久蜜臀| 国产乱淫av一区二区三区| 亚洲精品国产一区二区精华液| 日韩三级精品电影久久久 | 欧美国产精品一区二区| 成人av电影在线| 成人动漫中文字幕| 另类调教123区| 99久久精品国产精品久久| 美国毛片一区二区| 亚洲欧美色图小说| 国产在线不卡一区| 精品一区二区三区日韩| 欧美亚洲国产bt| 国产伦精一区二区三区| 亚洲综合一二三区| 国产亚洲欧美激情| 国产精品久久久久久亚洲伦| 久久综合九色综合97婷婷女人| 日韩影院精彩在线| 一二三区精品福利视频| 亚洲精品日韩综合观看成人91| 亚洲一区二区三区视频在线播放| 国产一区激情在线| 国产精品久久夜| 国产在线精品一区二区不卡了| 26uuu国产电影一区二区| 3atv一区二区三区| 欧美日韩成人一区| 日韩欧美国产一区二区三区| 久久精品亚洲乱码伦伦中文 | 夜色激情一区二区| 亚洲欧美aⅴ...| 亚洲成人av福利| 国产成人鲁色资源国产91色综 | 国产高清精品在线| 久久国产精品色婷婷| 亚洲一区二区三区国产| 亚洲精品视频在线看| 精品区一区二区| 欧美va日韩va| 激情综合网天天干| 韩国毛片一区二区三区| 欧美高清视频在线高清观看mv色露露十八 | 成人激情免费网站| 国产成人午夜视频| 欧美国产97人人爽人人喊| 欧美久久高跟鞋激| 亚洲欧美一区二区三区久本道91 | 91美女片黄在线观看91美女| 7777精品久久久大香线蕉| 中文字幕在线观看不卡| 青草国产精品久久久久久| 欧美亚洲动漫制服丝袜| 国产精品网曝门| 美女一区二区三区| 56国语精品自产拍在线观看| 亚洲在线中文字幕| 菠萝蜜视频在线观看一区| 日韩精品一区二区三区四区| 亚洲欧美一区二区在线观看| 亚洲男人的天堂av| 麻豆精品视频在线观看| 精品在线观看免费| 欧美一级夜夜爽| 免费观看日韩电影| 久久久99免费| 99久久久久久| 亚洲精品一卡二卡| 一区2区3区在线看| 美女视频一区二区| 九九在线精品视频| 国产亚洲综合av| 成人网在线播放| 亚洲精品国产无天堂网2021| 日韩欧美在线网站| 天天射综合影视| 国产一区二区导航在线播放| 亚洲成人av一区二区| 蜜臀久久99精品久久久久宅男 | 91精品福利在线| 亚洲国产欧美日韩另类综合 | 欧美精品tushy高清| 成人一区二区三区视频| 九色综合狠狠综合久久| 奇米一区二区三区| 亚洲国产综合色| 亚洲福利一区二区三区| 精品制服美女丁香| 中文字幕不卡在线| 中文在线一区二区| 综合久久给合久久狠狠狠97色| 亚洲欧洲精品一区二区精品久久久 | 亚洲色图色小说| 亚洲激情欧美激情| 亚洲亚洲人成综合网络| 夜夜揉揉日日人人青青一国产精品| 18成人在线观看| 一区二区在线免费观看| 亚洲福中文字幕伊人影院| 精久久久久久久久久久| 欧美精品一区二区三区久久久| 亚洲精品一区二区三区99| 亚洲日本在线观看| 黑人巨大精品欧美黑白配亚洲 | 午夜精品久久久久久久久| 蜜桃av一区二区三区电影| 99国产欧美久久久精品| 久久久综合九色合综国产精品| 欧美一级欧美一级在线播放| 中文字幕一区二区三中文字幕| 色悠悠亚洲一区二区| 国产精品亚洲成人| 成人av手机在线观看| 欧美色精品天天在线观看视频| 激情小说亚洲一区| 亚洲123区在线观看| 国产黄色成人av| 不卡的av中国片| 91精品啪在线观看国产60岁| 91精品国产色综合久久| 欧美xxxx老人做受| 欧美激情综合网| 免费观看久久久4p| 成人ar影院免费观看视频| 91麻豆精品国产综合久久久久久| 久久99精品久久久久婷婷| 色一情一乱一乱一91av| 欧美色电影在线| 777欧美精品| 久久精品免视看| 亚洲日本成人在线观看| 91香蕉视频mp4| 欧美人牲a欧美精品| 日韩一区二区精品在线观看| 国产xxx精品视频大全| 久久综合久久综合久久| **性色生活片久久毛片| 91在线视频官网| 91精品国产综合久久蜜臀| 青青草成人在线观看| 欧美日韩综合一区| 亚洲免费观看视频| 欧美日韩和欧美的一区二区| 亚洲一区二区三区视频在线| 欧美午夜精品电影| 福利一区二区在线观看| 欧美日韩成人综合天天影院| 天堂在线一区二区| 久久久久久久网| 91极品美女在线| 日韩av中文在线观看| 久久夜色精品一区| 99精品视频一区二区| 首页国产欧美久久| 国产精品视频在线看| 欧美男人的天堂一二区| 国产乱码精品一品二品| 亚洲成人综合网站| 久久免费精品国产久精品久久久久| aa级大片欧美| 久久综合丝袜日本网| 91理论电影在线观看| 久久精品国产秦先生| 亚洲乱码日产精品bd| 欧美高清视频www夜色资源网| 成人理论电影网|