欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go中的錯(cuò)誤和異常處理最佳實(shí)踐方法

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

錯(cuò)誤

認(rèn)識(shí)錯(cuò)誤

在Go中,錯(cuò)誤是一種表示程序錯(cuò)誤狀態(tài)。包含了在程序在運(yùn)行時(shí)、編譯時(shí)的狀態(tài)信息。一般我們?cè)诰帉慓o代碼中,都會(huì)碰到如下的處理方式。

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

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

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

自定義錯(cuò)誤

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

如下示例代碼:

package main

import (
"errors"
"fmt"
)
func printError() (a int, err error) {
err = errors.New("打印錯(cuò)誤信息")
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 打印錯(cuò)誤信息??。

實(shí)現(xiàn)原理

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

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

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

處理異常

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

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

異常處理原則

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

異常處理實(shí)踐

下面的示例代碼,在被調(diào)用函數(shù)printPanic()中觸發(fā)一個(gè)panic(),在main()函數(shù)中使用defer中接收panic()信息,并對(duì)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
打印錯(cuò)誤信息

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

相關(guān)文章

  • 關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng)總結(jié)(強(qiáng)烈推薦!)

    關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng)總結(jié)(強(qiáng)烈推薦!)

    map是一種無(wú)序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語(yǔ)言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng),需要的朋友可以參考下
    2023-01-01
  • Go語(yǔ)言中的錯(cuò)誤處理最佳實(shí)踐詳解

    Go語(yǔ)言中的錯(cuò)誤處理最佳實(shí)踐詳解

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的錯(cuò)誤處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以參考下
    2023-08-08
  • Go?錯(cuò)誤處理實(shí)踐總結(jié)示例

    Go?錯(cuò)誤處理實(shí)踐總結(jié)示例

    這篇文章主要為大家介紹了Go錯(cuò)誤處理實(shí)踐的總結(jié)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語(yǔ)言中的逃逸分析究竟是什么?

    Go語(yǔ)言中的逃逸分析究竟是什么?

    這篇文章主要介紹了Go語(yǔ)言中的逃逸,套喲究竟是什么呢?通俗來(lái)講,當(dāng)一個(gè)對(duì)象的指針被多個(gè)方法或線程引用時(shí),我們稱這個(gè)指針發(fā)生了“逃逸”。下面文章將詳細(xì)介紹Go語(yǔ)言中的逃逸,需要的朋友可以參考一下
    2021-09-09
  • go goroutine 怎樣進(jìn)行錯(cuò)誤處理

    go goroutine 怎樣進(jìn)行錯(cuò)誤處理

    在 Go 語(yǔ)言程序開發(fā)中,goroutine 的使用是比較頻繁的,因此在日常編碼的時(shí)候 goroutine 里的錯(cuò)誤處理,怎么做會(huì)比較好呢,本文就來(lái)詳細(xì)介紹一下
    2021-07-07
  • golang 如何獲取map所有key的方式

    golang 如何獲取map所有key的方式

    這篇文章主要介紹了golang 獲取map所有key的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2021-04-04
  • Go條件控制語(yǔ)句詳解(if-else、switch和select)

    Go條件控制語(yǔ)句詳解(if-else、switch和select)

    條件語(yǔ)句用于檢查一個(gè)條件是否為真,并根據(jù)條件的真假來(lái)決定是否執(zhí)行相應(yīng)的代碼,下面這篇文章主要給大家介紹了關(guān)于Go條件控制語(yǔ)句(if-else、switch和select)的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 詳解如何使用Golang操作MongoDB數(shù)據(jù)庫(kù)

    詳解如何使用Golang操作MongoDB數(shù)據(jù)庫(kù)

    在現(xiàn)代開發(fā)中,數(shù)據(jù)存儲(chǔ)是一個(gè)至關(guān)重要的環(huán)節(jié),MongoDB作為一種NoSQL數(shù)據(jù)庫(kù),提供了強(qiáng)大的功能和靈活的數(shù)據(jù)模型,與Golang的高性能和并發(fā)性能非常契合,本文將探討Golang與MongoDB的完美組合,介紹如何使用Golang操作MongoDB數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2023-11-11
  • docker中部署golang項(xiàng)目的步驟詳解

    docker中部署golang項(xiàng)目的步驟詳解

    這篇文章主要給大家介紹了關(guān)于在docker中部署golang項(xiàng)目的步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程

    go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程

    這篇文章主要為大家介紹了go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論