在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    Go 錯誤處理

    錯誤

    在Go中有一部分函數(shù)總是能成功的運行。比如strings.Contains和strconv.FormatBool函數(shù);對于大部分函數(shù)而言,永遠(yuǎn)無法確保能否成功運行。

    Go 語言通過內(nèi)置的錯誤接口提供了非常簡單的錯誤處理機制。

    error類型是一個接口類型,這是它的定義:

    type error interface { Error() string}

    我們可以在編碼中通過實現(xiàn) error 接口類型來生成錯誤信息。

    函數(shù)通常在最后的返回值中返回錯誤信息。使用errors.New 可返回一個錯誤信息:

    func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("math: square root of negative number") } // 實現(xiàn)}

    這里有一個錯誤處理的例子

    package mainimport “errors”import “fmt”// 按照慣例,錯誤通常是最后一個返回值并且是 error 類型,一個內(nèi)建的接口。func f1(arg int) (int, error) {// errors.New 構(gòu)造一個使用給定的錯誤信息的基本error 值。if arg == 42 {return -1, errors.New(“can’t work with 42”)}// 返回錯誤值為 nil 代表沒有錯誤。return arg + 3, nil}// 通過實現(xiàn) Error 方法來自定義 error 類型是可以的。// 這里使用自定義錯誤類型來表示上面的參數(shù)錯誤。type argError struct {arg intprob string}func (e *argError) Error() string {return fmt.Sprintf(“%d – %s”, e.arg, e.prob)}func f2(arg int) (int, error) {if arg == 42 {// 在這個例子中,我們使用 &argError 語法來建立一個新的結(jié)構(gòu)體,并提供了 arg 和 prob 這個兩個字段的值。return -1, &argError{arg, “can’t work with it”}}return arg + 3, nil}func main() {// 下面的兩個循環(huán)測試了各個返回錯誤的函數(shù)。// 注意在 if行內(nèi)的錯誤檢查代碼,在 Go 中是一個普遍的用法。for _, i := range []int{7, 42} {if r, e := f1(i); e != nil {fmt.Println(“f1 失敗:”, e)} else {fmt.Println(“f1 工作:”, r)}}for _, i := range []int{7, 42} {if r, e := f2(i); e != nil {fmt.Println(“f2 失敗:”, e)} else {fmt.Println(“f2 工作:”, r)}}// 你如果想在程序中使用一個自定義錯誤類型中的數(shù)據(jù),你需要通過類型斷言來得到這個錯誤類型的實例。_, e := f2(42)if ae, ok := e.(*argError); ok {fmt.Println(ae.arg)fmt.Println(ae.prob)}}

    Deferred函數(shù)

    defer語句經(jīng)常被用于處理成對的操作,如打開、關(guān)閉、連接、斷開連接、加鎖、釋放鎖。通過defer機制,不論函數(shù)邏輯多復(fù)雜,都能保證在任何執(zhí)行路徑下,資源被釋放。釋放資源的defer應(yīng)該直接跟在請求資源的語句后。

    示例

    package mainimport “fmt”import “os”func main() {// 假設(shè)我們想要創(chuàng)建一個文件,向它進行寫操作,然后在結(jié)束時關(guān)閉它。// 這里展示了如何通過 defer 來做到這一切。f := createFile(“D:/defer.txt”) // f := createFile(“/tmp/defer.txt”)// 在 closeFile 后得到一個文件對象,我們使用 defer通過 closeFile 來關(guān)閉這個文件。這會在封閉函數(shù)(main)結(jié)束時執(zhí)行,就是 writeFile 結(jié)束后。defer closeFile(f)writeFile(f)}func createFile(p string) *os.File {fmt.Println(“creating”)f, err := os.Create(p)if err != nil {panic(err)}return f}func writeFile(f *os.File) {fmt.Println(“writing”)fmt.Fprintln(f, “data”)}func closeFile(f *os.File) {fmt.Println(“closing”)f.Close()}

    異常

    Go的類型系統(tǒng)會在編譯時捕獲很多錯誤,但有些錯誤只能在運行時檢查,如數(shù)組訪問越界、空指針引用等。這些運行時錯誤會引起painc異常。

    示例如下:

    package mainimport (“fmt””os”)func main() {// 我們將在這個網(wǎng)站中使用 panic 來檢查預(yù)期外的錯誤。這個是唯一一個為 panic 準(zhǔn)備的例子。panic(“一個異常”)// panic 的一個基本用法就是在一個函數(shù)返回了錯誤值但是我們并不知道(或者不想)處理時終止運行。// 這里是一個在創(chuàng)建一個新文件時返回異常錯誤時的panic 用法。fmt.Println(“繼續(xù)”)_, err := os.Create(“/tmp/file”)if err != nil {panic(err)}// 運行程序?qū)?panic,輸出一個錯誤消息和 Go 運行時棧信息,并且返回一個非零的狀態(tài)碼。}

    捕獲異常

    通常來說,不應(yīng)該對panic異常做任何處理,但有時,也許我們可以從異常中恢復(fù),至少我們可以在程序崩潰前,做一些操作。舉個例子,當(dāng)web服務(wù)器遇到不可預(yù)料的嚴(yán)重問題時,在崩潰前應(yīng)該將所有的連接關(guān)閉;如果不做任何處理,會使得客戶端一直處于等待狀態(tài)。如果web服務(wù)器還在開發(fā)階段,服務(wù)器甚至可以將異常信息反饋到客戶端,幫助調(diào)試。

    如果在deferred函數(shù)中調(diào)用了內(nèi)置函數(shù)recover,并且定義該defer語句的函數(shù)發(fā)生了panic異常,recover會使程序從panic中恢復(fù),并返回panic value。導(dǎo)致panic異常的函數(shù)不會繼續(xù)運行,但能正常返回。在未發(fā)生panic時調(diào)用recover,recover會返回nil。

    示例:

    package mainimport “fmt”func main() {// 這里我們對異常進行了捕獲defer func() {if p := recover(); p != nil {err := fmt.Errorf(“internal error: %v”, p)if err != nil {fmt.Println(err)}}}()// 我們將在這個網(wǎng)站中使用 panic 來檢查預(yù)期外的錯誤。這個是唯一一個為 panic 準(zhǔn)備的例子。panic(“一個異常”)}

    分享不易,歡迎大家點贊關(guān)注~~~ 感謝大家閱讀!

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年6月20日 09:16
    下一篇 2022年6月20日 09:16

    相關(guān)推薦

    • 存儲過程語法(sql server存儲過程語法)

      今天小編給各位分享存儲過程語法的知識,其中也會對sql server存儲過程語法進行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲過程基本語法…

      2022年11月26日
    • 淘寶直播開通后帶貨鏈接怎么做(淘寶直播需要開通淘寶店鋪嗎)

      直播帶貨無論是對于商家來說還是主播收益都是非常可觀的,所以不少平臺都有直播帶貨功能,一些小伙伴也想加入淘寶直播,那么淘寶直播開通后帶貨鏈接怎么做?下面小編為大家?guī)硖詫氈辈ラ_通后帶…

      2022年11月24日
    • 今天出入濟南最新通知(出入濟南政策最新消息今天)

      近日濟南疫情感染人數(shù)也在不斷增加,劃分的高風(fēng)險區(qū)也是越來越多了。據(jù)最新統(tǒng)計,截止2022年11月24日11時,濟南共有低風(fēng)險地區(qū)12處,高風(fēng)險地區(qū)338處。很多朋友都擔(dān)心現(xiàn)在濟南無…

      2022年11月24日
    • 快手限流多久能解除(快手限流什么意思)

      我相信很多人都看中了快手平臺的商機,都爭先恐后地想要搶占機會,可一些人剛剛作出一點成績,就被降權(quán)了,自己也不知道什么原因。所以今天就來聊聊快手賬號降權(quán)操作分享,趕快來看看避免違規(guī)!…

      2022年11月23日
    • 微信健康碼怎么注銷重新申請健康碼 怎么更換綁定人

      在疫情常態(tài)化的管理之下,出行都需要健康碼,那么如果因為種種原因注銷了健康碼怎么辦呢?這種情況下是否還可以再申請健康碼呢?下面一起來看看了解一下吧! 微信健康碼注銷了還能申請嗎 健康…

      2022年11月22日
    • Win11 22H2再出新問題Bug:無法彈出USB設(shè)備

      作為Windows 11的首次大更新,在Win11 22H2發(fā)布后并沒有帶來預(yù)想的場景,各種問題頻現(xiàn)成為了一種常態(tài)。 近日有消息稱,Win11 22H2存在一個占用沖突Bug,當(dāng)用…

      2022年11月22日
    • 不遷怒,不貳過一《論語》(不遷怒不貳過是孔子哪位弟子)

      不遷怒,不貳過。 ——《論語》 犯了錯誤,不要遷怒別人,并且不要再犯第二次。這樣的人,才稱得上是一個有覺悟的人。只有那些沒有開悟,沒有活明白的人,才會好了傷疤忘了痛,反復(fù)多次犯同樣…

      2022年11月22日
    • 美團月付300小額取現(xiàn)?美團月付取現(xiàn)300不見了

      很多上班族每天都在使用美團點外賣,你知道美團現(xiàn)在推出了一款類似花唄的產(chǎn)品嗎?可以在美團消費的時候先消費后還款,叫做美團月付,是美團推出的一款消費型產(chǎn)品,不能直接提現(xiàn)到銀行卡,只能用…

      2022年11月21日
    • ftp端口號(ftp端口號可以自定義嗎)

      FTP端口號是21在FTP服務(wù)器中,我們往往會給不同的部門或者某個特定的用戶設(shè)置一個帳戶但是,這個賬戶有個特點,就是其只能夠訪問自己的主目錄服務(wù)器通過這種方式來保障FTP服務(wù)上其他…

      2022年11月21日
    • 暴雪啟動器卡在“正在更新暴雪啟動器”?

      一直卡,用360流量監(jiān)控看到agent連不上服務(wù)器,C:\ProgramData\Battle.net\Agent\Agent.1040\Logs里的AgentErrors文件里有…

      2022年11月20日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息