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

Go語音開發(fā)中常見Error類型處理示例詳解

 更新時間:2022年12月07日 16:22:46   作者:bluesGavin  
這篇文章主要為大家介紹了Go語音開發(fā)中常見Error類型處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

上文我們了解了 Error Go 中的設(shè)計理念。單從理念上來看, Error 的設(shè)計似乎有利于邏輯處理。但實(shí)際上,在開發(fā)過程中,我們還會遇到各種各樣的困難。為了優(yōu)化開發(fā)的流程,開發(fā)者們發(fā)明了很多處理 Error 的做法。今天我們就來看看目前 Go 開發(fā)中常見的幾大 Error 類型。

透明錯誤處理策略

在最簡單的 Go Error 設(shè)計中,開發(fā)者被期望通過判定函數(shù)返回的 err 值來確定調(diào)用是否正常。

value, err := doSomething()
if err != nil {
	// 錯誤處理
}
// 邏輯操作

這是 Go 語言中最常見的錯誤處理策略 ,80%以上的 Go 錯誤處理情形都可以歸類到這種策略下。這樣構(gòu)造出的錯誤值代表的上下文信息,對錯誤處理方是透明的,因此這種策略稱為 透明錯誤處理策略 。

這種策略最大的問題是,無法判定錯誤的原因和種類。它只是簡單地把”是否出錯“分為了兩路邏輯。一旦我們的業(yè)務(wù)要求我們針對不同的錯誤原因,做不同的處理,這種情況就行不通了。

帶來的問題

透明策略只解決了”是否出錯“的問題,但開發(fā)者無法知道錯誤的原因。如果想要得到錯誤的內(nèi)容,需要主動解析error值,這也引出了下面要講的處理策略。

哨兵(Sentinel)錯誤處理策略

哨兵策略策略主要是解決透明錯誤處理策略精度不夠的情況,它可以讓開發(fā)者得到“是什么錯誤”,而不僅是”是否出錯“。實(shí)際上,它就是通過預(yù)定義錯誤類型,在錯誤處理時,判斷錯誤是否屬于預(yù)定義的類別,從而做出處理。

因此我們可以得到它最簡單的實(shí)現(xiàn):

value, err := doSomething()
if err!=nil { 
    // 通過err.Error()獲得錯誤信息
    switch err.Error(){ 
        case "bufio: negative count": 
        	//特點(diǎn)錯誤處理 
        	return 
        // 其他判斷
        default: 
        	// 未知錯誤原因
        	return 
    } 
}

但這顯然不是好的寫法,會導(dǎo)致很嚴(yán)重的耦合問題。Go 1.13 之后,我們可以用 error.Is 方法很好地解決這個問題。

// 定義錯誤類型,一般變量用Err開頭
var(
  ErrInvalidUnreadByte=errors.New("bufio: invalid use of UnreadByte")ErrInvalidUnreadRune=errors.New("bufio: invalid use of UnreadRune")
  ErrBufferFull=errors.New("bufio: buffer full")
  ErrNegativeCount=errors.New("bufio: negative count")
)

func main(){
	value, err := doSomething()
  	if errors.Is(err,ErrBufferFull){
    	//判斷是否為某類型錯誤
  	}
}

帶來的問題

雖然哨兵策略解決了我們不能獲得錯誤原因的問題,但它本身也存在著設(shè)計缺陷。

1.對errors.Error()的依賴

== 的判斷依賴著 errors.Error() 的輸出。這是哨兵策略最大的問題。他導(dǎo)致了 error 值的擴(kuò)展性很差,假如開發(fā)者想要為 error 帶上上下文或者錯誤行號,文件位置等信息,都會破壞哨兵策略的判斷。

從某種角度來看,errors.Error() 的輸出更應(yīng)該是用于開發(fā)者的調(diào)試使用,而不應(yīng)該作為程序判斷機(jī)制的一部分。

2.定義的錯誤類型會被公開

很多時候為了做錯誤類型判斷,一些包內(nèi)需要定義許多錯誤類型。而這些錯誤類型通常會被共用,這使得他們不得不被公開。在公共庫中,被公開的錯誤類型必須有專門的文檔說明,否則會對使用者造成困惑。這會額外增加開發(fā)者的工作量。

再者,有時為了判斷某個特殊錯誤類型,使用者會引入對應(yīng)的包。假如這種情況大量存在,會導(dǎo)致整個庫生態(tài)極其混亂。

Error types

Error types 是實(shí)現(xiàn)了 errors 接口的自定義類型,目的是為了更加具體地描述錯誤。開發(fā)者可以在類型上帶上需要的信息,如行號,文件位置等??梢詤⒖枷路剑?/p>

type MyError struct {
    Msg string	// 錯誤信息
    Line int	// 行號
    FIle string // 文件位置
}

// 實(shí)現(xiàn) errors 接口
func (e *MyError) Error()string{
    return fmt.Sprintf("%s:%d: %s",e.File,e.Line,e.Msg)
}
    

上面提到,修改 error 值會導(dǎo)致哨兵策略的失效, Error types 就是例子之一。由于是自定義的類型,我們不能再用 == 判斷錯誤類型了,而是改用斷言。

value, ok := x.(MyError)
if ok {
    //判斷是否為某類型錯誤
}

帶來的問題

可以看到 Error Types 最大的優(yōu)勢是其豐富的錯誤描述能力。但它仍然沒有解決哨兵策略下的問題。

不透明錯誤處理策略(Opaque errors)

不透明錯誤處理策略可以說是最靈活的處理方式,它要求代碼與調(diào)用者之間的耦合最少。開發(fā)者可以知道”是否出錯“,但無法得到錯誤的內(nèi)部信息。

value, err := doSomething()
if err != nil {
	// 錯誤處理
}
// 邏輯操作

是的,在使用上不透明策略透明策略是很相似的。其中最大的不同是,透明策略可以通過 error.Error() 接口獲得錯誤信息。而不透明策略中是不可以的。

那如果開發(fā)者需要判斷錯誤類型怎么辦呢?不透明策略更推薦的是斷言 error 實(shí)現(xiàn)的行為,而不是特定的類型或值??梢詤⒖枷路酱a:

type temporary interface {
    Temporary() bool
}
// 封裝判斷函數(shù)
func IsTemporary(err error) bool {
    // 斷言
    te, ok := err.(temporay)
    // 是否滿足條件
    return ok && te.Temporary()
}

帶來的問題

不透明策略跟透明策略一樣,是很靈活的策略。他們的區(qū)別只在于錯誤的信息是否開放。因此,不透明策略依舊存在信息量缺乏的問題。

總結(jié)

今天我們了解了目前 Go 開發(fā)中常見的四種 Error 類型。這些類型各有優(yōu)劣,需要開發(fā)者在實(shí)際開發(fā)者中深入思考,做出取舍。通常我們需要考慮,我們開發(fā)的是工具還是業(yè)務(wù),我們需要錯誤為我們提供靈活度還是精確的信息。掌握本文的內(nèi)容,可以讓你在遇到錯誤處理時,有更多的處理思路。

當(dāng)然,每種方式又會有問題,在接下來的文章里,我會分享一些常見的錯誤處理操作。

以上就是Go語音開發(fā)中常見Error類型處理示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語音Error類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • win10下安裝Go和Goland的詳細(xì)教程

    win10下安裝Go和Goland的詳細(xì)教程

    這篇文章主要介紹了win10下安裝Go和Goland的詳細(xì)教程,本文給大家提到了go和golang之間的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Golang?Mutex錯過會后悔的重要知識點(diǎn)分享

    Golang?Mutex錯過會后悔的重要知識點(diǎn)分享

    互斥鎖?Mutex?是并發(fā)控制的一個基本手段,是為了避免并發(fā)競爭建立的并發(fā)控制機(jī)制,本文主要為大家整理了一些Mutex的相關(guān)知識點(diǎn),希望對大家有所幫助
    2023-07-07
  • 淺談Golang是如何讀取文件內(nèi)容的(7種)

    淺談Golang是如何讀取文件內(nèi)容的(7種)

    這篇文章主要介紹了淺談Golang是如何讀取文件內(nèi)容的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 從Node.js 轉(zhuǎn)到 Go平臺

    從Node.js 轉(zhuǎn)到 Go平臺

    回顧過去的一年,我們在技術(shù)棧上的最大改變就是從 Node.js 切換到 Go 。我們的聯(lián)合創(chuàng)始人,Steve Kaliski, 在 Poptip 把 Node.js 切換成了 Go,可惜他沒有學(xué)習(xí)到當(dāng)時的教訓(xùn)。
    2015-03-03
  • 一文帶你深入理解Golang Context包

    一文帶你深入理解Golang Context包

    在 Go 語言中,Context 包是一種非常常用的工具,它被用來管理 goroutine 之間的通信和取消。本文將深入探討Context 包的基本原理,包括使用場景、原理和一些最佳實(shí)踐,需要的可以參考下
    2023-05-05
  • Go channel如何批量讀取數(shù)據(jù)

    Go channel如何批量讀取數(shù)據(jù)

    本文將展示一個從 Go channel 中批量讀取數(shù)據(jù),并批量發(fā)送到 Kafka 和批量寫入網(wǎng)絡(luò)數(shù)據(jù)的示例,文中的示例代碼講解詳細(xì),有需要的可以參考下
    2024-10-10
  • 利用Golang生成整數(shù)隨機(jī)數(shù)方法示例

    利用Golang生成整數(shù)隨機(jī)數(shù)方法示例

    這篇文章主要介紹了利用Golang生成整數(shù)隨機(jī)數(shù)的相關(guān)資料,文中給出了詳細(xì)的介紹和完整的示例代碼,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • Golang的Fork/Join實(shí)現(xiàn)代碼

    Golang的Fork/Join實(shí)現(xiàn)代碼

    Fork/Join本質(zhì)上是一種任務(wù)分解,將一個很大的任務(wù)分解成若干個小任務(wù),然后再對小任務(wù)進(jìn)一步分解,直到最小顆粒度,然后并發(fā)執(zhí)行,對Golang的Fork/Join實(shí)現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • Go語言異常處理(Panic和recovering)用法詳解

    Go語言異常處理(Panic和recovering)用法詳解

    異常處理是程序健壯性的關(guān)鍵,往往開發(fā)人員的開發(fā)經(jīng)驗的多少從異常部分處理上就能得到體現(xiàn)。Go語言中沒有Try?Catch?Exception機(jī)制,但是提供了panic-and-recover機(jī)制,本文就來詳細(xì)講講他們的用法
    2022-07-07
  • Go語言刪除文本文件中的指定行操作代碼

    Go語言刪除文本文件中的指定行操作代碼

    假設(shè)現(xiàn)在有一個文本文件,我們需要刪除文件中亂碼的行。我們可以使用go的os庫來處理文件,遍歷整個文件然后將除過亂碼的行寫入一個新文件,以此來實(shí)現(xiàn)我們的需求,這篇文章主要介紹了Go語言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12

最新評論

太仆寺旗| 贞丰县| 巧家县| 宁南县| 疏勒县| 吉林省| 渝中区| 吴堡县| 镇江市| 瓮安县| 丰原市| 镇远县| 犍为县| 康定县| 健康| 星子县| 习水县| 神木县| 惠州市| 郓城县| 神木县| 江都市| 阜南县| 错那县| 河间市| 唐海县| 聊城市| 汝州市| 化德县| 通许县| 台山市| 新野县| 新营市| 玉龙| 台州市| 饶平县| 湘西| 清远市| 阳信县| 深州市| 息烽县|