最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go中的錯誤和異常處理最佳實踐方法

 更新時間:2022年09月05日 11:18:05   作者:7small7???????  
這篇文章主要介紹了Go中的錯誤和異常處理最佳實踐方法,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下

錯誤

認(rèn)識錯誤

在Go中,錯誤是一種表示程序錯誤狀態(tài)。包含了在程序在運行時、編譯時的狀態(tài)信息。一般我們在編寫Go代碼中,都會碰到如下的處理方式。

file, err := os.Create("test.txt")
fmt.Println(file)
if err != nil {
fmt.Println(err)
return
}

我們使用os庫創(chuàng)建一個名為test.txt的文件,該方法返回一個文件指針或err的錯誤信息。

err表示文件創(chuàng)建失敗時的錯誤信息。當(dāng)存儲錯誤時,我們則對程序做錯誤處理;不存在錯誤時,則正常執(zhí)行其他的邏輯代碼。

自定義錯誤

在Go中是允許我們自定義錯誤信息的。自定義錯誤信息需要利用自帶的error報中的New()函數(shù)。

如下示例代碼:

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 打印錯誤信息??。

實現(xiàn)原理

在使用??errors.New()??函數(shù)時,該包中聲明了一個結(jié)構(gòu)體??errorString??并且實現(xiàn)了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
}

異常

認(rèn)識異常

異常是程序在??編譯時??或者??運行時??發(fā)生的異常信息。如果不對異常做處理,可能導(dǎo)致程序終止程序或者拋出異常信息,導(dǎo)致程序無法正常運行。不管是在程序編譯或者運行時,都需要對異常進(jìn)行嚴(yán)格處理。

如下代碼,程序在編譯時就會觸發(fā)異常,導(dǎo)致無法進(jìn)行正常編譯:

package main

import "fmt"

func main() {
panic("print panic")
fmt.Println("end")
}

打印結(jié)果:

╰─ 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 運行時會觸發(fā)運行時 panic,伴隨著程序的崩潰拋出一個 runtime.Error 接口類型的值。這個錯誤值有個 RuntimeError() 方法用于區(qū)別普通錯誤。
  • panic 可以直接從代碼初始化:當(dāng)錯誤條件(我們所測試的代碼)很嚴(yán)苛且不可恢復(fù),程序不能繼續(xù)運行時,可以使用 panic 函數(shù)產(chǎn)生一個中止程序的運行時錯誤。
  • panic 接收一個做任意類型的參數(shù),通常是字符串,在程序死亡時被打印出來。Go 運行時負(fù)責(zé)中止程序并給出調(diào)試信息。
  • 在多層嵌套的函數(shù)調(diào)用中調(diào)用 panic,可以馬上中止當(dāng)前函數(shù)的執(zhí)行。

處理異常

當(dāng)程序在運行過程中發(fā)生異常,會終止程序的正常運行。需要嚴(yán)格處理異常信息。Go中可以使用recover()將程序從panic中獲取異常信息,并獲取程序的執(zhí)行權(quán)。

  • 正如名字一樣,這個(recover)內(nèi)建函數(shù)被用于從 panic 或 錯誤場景中恢復(fù):讓程序可以從 panicking 重新獲得控制權(quán),停止終止過程進(jìn)而恢復(fù)正常執(zhí)行。
  • recover只能在defer修飾的函數(shù)中使用:用于取得panic調(diào)用中傳遞過來的錯誤值,如果是正常執(zhí)行,調(diào)用recover會返回 nil,且沒有其它效果。
  • panic 會導(dǎo)致棧被展開直到defer修飾的recover()被調(diào)用或者程序中止。
  • 所有的 defer 語句都會保證執(zhí)行并把控制權(quán)交還給接收到 panic 的函數(shù)調(diào)用者。這樣向上冒泡直到最頂層,并執(zhí)行(每層的) defer,在棧頂處程序崩潰,并在命令行中用傳給 panic 的值報告錯誤情況:這個終止過程就是 panicking。

異常處理原則

  • 在包內(nèi)部,應(yīng)該從panic中recover:不允許顯式的超出包范圍的panic()。在包內(nèi)部,特別是在非導(dǎo)出函數(shù)中有很深層次的嵌套調(diào)用時,對主調(diào)函數(shù)來說用 panic 來表示應(yīng)該被翻譯成錯誤的錯誤場景是很有用的(并且提高了代碼可讀性)。
  • 在包外部,向包的調(diào)用者返回錯誤值(而不是panic)。
  • Go 庫的原則是即使在包的內(nèi)部使用了 panic,在它的對外接口(API)中也必須用 recover 處理成返回顯式的錯誤。

異常處理實踐

下面的示例代碼,在被調(diào)用函數(shù)printPanic()中觸發(fā)一個panic(),在main()函數(shù)中使用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")
}

打印結(jié)果:

╰─ go run demo5.go
i value is 1
打印錯誤信息

到此這篇關(guān)于Go中的錯誤和異常處理最佳實踐方法的文章就介紹到這了,更多相關(guān)Go異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GOLang單元測試用法詳解

    GOLang單元測試用法詳解

    Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現(xiàn)單元測試和性能測試。本文將通過示例詳細(xì)聊聊Go語言單元測試的原理與使用,需要的可以參考一下
    2022-12-12
  • Go語言實現(xiàn)順序存儲的線性表實例

    Go語言實現(xiàn)順序存儲的線性表實例

    這篇文章主要介紹了Go語言實現(xiàn)順序存儲的線性表的方法,實例分析了Go語言實現(xiàn)線性表的定義、插入、刪除元素等的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Go語言中的Struct結(jié)構(gòu)體

    Go語言中的Struct結(jié)構(gòu)體

    這篇文章介紹了Go語言中的Struct結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染

    go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染

    這篇文章主要為大家介紹了go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Go語言實現(xiàn)類似c++中的多態(tài)功能實例

    Go語言實現(xiàn)類似c++中的多態(tài)功能實例

    Go本身不具有多態(tài)的特性,不能夠像Java、C++那樣編寫多態(tài)類、多態(tài)方法。但是,使用Go可以編寫具有多態(tài)功能的類綁定的方法。下面來一起看看吧
    2016-09-09
  • Golang指針的操作以及常用的指針函數(shù)

    Golang指針的操作以及常用的指針函數(shù)

    本文主要介紹了Golang指針的操作以及常用的指針函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • golang使用aes庫實現(xiàn)加解密操作

    golang使用aes庫實現(xiàn)加解密操作

    這篇文章主要介紹了golang使用aes庫實現(xiàn)加解密操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go開發(fā)alertmanger實現(xiàn)釘釘報警

    go開發(fā)alertmanger實現(xiàn)釘釘報警

    本文主要介紹了go開發(fā)alertmanger實現(xiàn)釘釘報警,通過自己的url實現(xiàn)alertmanager的釘釘報警,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • GO語言中ni,零值與空結(jié)構(gòu)體的使用

    GO語言中ni,零值與空結(jié)構(gòu)體的使用

    Go語言為Java開發(fā)者帶來了一些新概念,如零值、nil和空結(jié)構(gòu)體,理解這些概念有助于Go語言的學(xué)習(xí)和應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 手把手教你導(dǎo)入Go語言第三方庫

    手把手教你導(dǎo)入Go語言第三方庫

    本文主要介紹了手把手教你導(dǎo)入Go語言第三方庫,通過導(dǎo)入gin包來深入學(xué)習(xí),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

汤阴县| 湟中县| 漳州市| 扶风县| 汕尾市| 宁夏| 黑河市| 内乡县| 涿州市| 柏乡县| 昌平区| 维西| 华安县| 阜新市| 潢川县| 丰城市| 普宁市| 个旧市| 鹤峰县| 邵东县| 自治县| 贺兰县| 威远县| 上饶县| 鱼台县| 东乡| 通山县| 焦作市| 曲阳县| 两当县| 利辛县| 和田市| 邹城市| 本溪| 安康市| 双柏县| 海城市| 南部县| 南投县| 麟游县| 左权县|