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

在Go中創(chuàng)建自定義錯誤的方式總結

 更新時間:2024年01月16日 14:51:28   作者:CHQIUU  
在程序開發(fā)中錯誤處理是至關重要的,下面這篇文章主要給大家介紹了關于在Go中創(chuàng)建自定義錯誤的方式,文中通過代碼介紹的非常詳細,對大家學習或者使用Go具有一定的參考借鑒價值,需要的朋友可以參考下

引言

Go提供了兩種在標準庫中創(chuàng)建錯誤的方法,[errors.Newfmt.Errorf],當與用戶交流更復雜的錯誤信息時,或在調(diào)試時與未來的自己交流時,有時這兩種機制不足以充分捕獲和報告所發(fā)生的情況。為了傳達更復雜的錯誤信息并實現(xiàn)更多的功能,我們可以實現(xiàn)標準庫接口類型,error

其語法如下:

type error interface {
  Error() string
}

builtin包將error定義為一個接口,它只有一個Error()方法,返回一個字符串形式的錯誤消息。通過實現(xiàn)這個方法,我們可以將定義的任何類型轉換為我們自己的error。

讓我們嘗試運行以下示例來查看error接口的實現(xiàn):

package main

import (
	"fmt"
	"os"
)

type MyError struct{}

func (m *MyError) Error() string {
	return "boom"
}

func sayHello() (string, error) {
	return "", &MyError{}
}

func main() {
	s, err := sayHello()
	if err != nil {
		fmt.Println("unexpected error: err:", err)
		os.Exit(1)
	}
	fmt.Println("The string:", s)
}
Outputunexpected error: err: boom
exit status 1

在這里,我們創(chuàng)建了一個新的空結構類型MyError,并在其上定義了Error()方法。Error()方法返回字符串"boom"。

main()中,我們調(diào)用函數(shù)sayHello,該函數(shù)返回一個空字符串和一個新的MyError實例。由于sayHello總是會返回錯誤,所以main()中的if語句體中的fmt.Println調(diào)用總是會執(zhí)行。然后,我們使用fmt.Println打印短前綴字符串"unexpected error:"以及err變量中保存的MyError實例。

請注意,我們不必直接調(diào)用Error(),因為fmt包能夠自動檢測這是Error 的實現(xiàn)。它透明地調(diào)用Error()來獲取字符串"boom",并將其與前綴字符串"unexpected Error: err:"連接起來。

在自定義錯誤中收集詳細信息

有時候,自定義錯誤是捕獲詳細錯誤信息的最簡潔方式。例如,假設我們想要捕獲HTTP請求產(chǎn)生的錯誤的狀態(tài)碼;運行以下程序來查看error的實現(xiàn),它允許我們清晰地捕獲信息:

package main

import (
	"errors"
	"fmt"
	"os"
)

type RequestError struct {
	StatusCode int

	Err error
}

func (r *RequestError) Error() string {
	return fmt.Sprintf("status %d: err %v", r.StatusCode, r.Err)
}

func doRequest() error {
	return &RequestError{
		StatusCode: 503,
		Err:        errors.New("unavailable"),
	}
}

func main() {
	err := doRequest()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Println("success!")
}

Outputstatus 503: err unavailable
exit status 1

在這個例子中,我們創(chuàng)建了一個新的RequestError實例,并使用標準庫中的errors.New函數(shù)提供狀態(tài)碼和一個錯誤。然后像前面的例子一樣,我們使用fmt.Println打印它。

RequestErrorError()方法中,我們使用fmt.Sprintf函數(shù)來使用創(chuàng)建錯誤時提供的信息來構造一個字符串。

類型斷言和自定義錯誤

error接口只公開了一個方法,但我們可能需要訪問error實現(xiàn)的其他方法來正確處理錯誤。例如,我們可能有幾個臨時的error自定義實現(xiàn),可以通過存在的 temporary()方法進行檢索。

接口為類型提供了更廣泛的方法集合,因此我們必須使用類型斷言來更改view正在顯示的方法,或者完全刪除它。

下面的例子在之前的RequestError的基礎上增加了一個Temporary()方法,該方法將表明調(diào)用者是否應該重試請求:

package main

import (
	"errors"
	"fmt"
	"net/http"
	"os"
)

type RequestError struct {
	StatusCode int

	Err error
}

func (r *RequestError) Error() string {
	return r.Err.Error()
}

func (r *RequestError) Temporary() bool {
	return r.StatusCode == http.StatusServiceUnavailable // 503
}

func doRequest() error {
	return &RequestError{
		StatusCode: 503,
		Err:        errors.New("unavailable"),
	}
}

func main() {
	err := doRequest()
	if err != nil {
		fmt.Println(err)
		re, ok := err.(*RequestError)
		if ok {
			if re.Temporary() {
				fmt.Println("This request can be tried again")
			} else {
				fmt.Println("This request cannot be tried again")
			}
		}
		os.Exit(1)
	}

	fmt.Println("success!")
}

Outputunavailable
This request can be tried again
exit status 1

main()中,我們調(diào)用doRequest(),它會返回一個error接口給我們。我們首先打印 error()方法返回的錯誤消息。接下來,我們嘗試使用類型斷言re, ok := err.(*RequestError)來暴露RequestError中的所有方法。如果類型斷言成功,那么我們使用Temporary()方法來查看此錯誤是否為臨時錯誤。由于doRequest()設置的StatusCode503,這與http.StatusServiceUnavailable匹配,因此返回true并導致打印" this request can be try again"。在實踐中,我們會發(fā)送另一個請求,而不是打印一條消息。

包裝錯誤

通常,錯誤會在程序之外產(chǎn)生,例如:數(shù)據(jù)庫、網(wǎng)絡連接等。這些錯誤提供的錯誤消息不能幫助任何人找到錯誤的根源。在錯誤消息的開頭使用額外的信息包裝錯誤,可以為成功調(diào)試提供一些必要的上下文。

下面的例子演示了我們?nèi)绾螌⒁恍┥舷挛男畔⒏郊拥綇钠渌瘮?shù)返回的晦澀的error上:

package main

import (
	"errors"
	"fmt"
)

type WrappedError struct {
	Context string
	Err     error
}

func (w *WrappedError) Error() string {
	return fmt.Sprintf("%s: %v", w.Context, w.Err)
}

func Wrap(err error, info string) *WrappedError {
	return &WrappedError{
		Context: info,
		Err:     err,
	}
}

func main() {
	err := errors.New("boom!")
	err = Wrap(err, "main")

	fmt.Println(err)
}

Outputmain: boom!

WrappedError是一個有兩個字段的結構體:一個是string類型的上下文消息,另一個是error類型,WrappedError提供了更多的信息。當Error()方法被調(diào)用時,我們再次使用fmt.Sprintf來打印上下文消息,然后Error(fmt.Sprintf也知道隱式調(diào)用Error()方法)。

main()中,我們使用errors.New創(chuàng)建一個錯誤,然后使用我們定義的wrap函數(shù)包裝這個錯誤。這允許我們指出這個error是在"main"中生成的。此外,由于我們的WrappedError也是一個error,我們可以包裝其他的WrappedError,這將允許我們看到一個鏈來幫助我們追蹤錯誤的來源。在標準庫的幫助下,我們甚至可以在錯誤中嵌入完整的堆棧跟蹤。

總結

由于error接口只有一個方法,我們已經(jīng)看到我們可以為不同的情況提供不同類型的錯誤。這可以涵蓋從將多條信息作為錯誤的一部分進行溝通到實現(xiàn)指數(shù)回退的所有事情。雖然Go中的錯誤處理機制表面上看起來很簡單,但我們可以使用這些自定義錯誤來處理常見和不常見的情況,從而實現(xiàn)相當豐富的處理。

Go還有另一種溝通意外行為的機制panics。在錯誤處理系列的下一篇文章中,我們將研究恐慌——它們是什么以及如何處理它們。

到此這篇關于在Go中創(chuàng)建自定義錯誤的文章就介紹到這了,更多相關Go創(chuàng)建自定義錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go并發(fā)4種方法簡明講解

    Go并發(fā)4種方法簡明講解

    這篇文章主要介紹了Go并發(fā)4種方法簡明講解,需要的朋友可以參考下
    2022-04-04
  • golang實現(xiàn)對JavaScript代碼混淆

    golang實現(xiàn)對JavaScript代碼混淆

    在Go語言中,你可以使用一些工具來混淆JavaScript代碼,一個常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過Go語言的`os/exec`包來調(diào)用Terser工具,本文給通過一個簡單的示例給大家介紹一下,感興趣的朋友可以參考下
    2024-01-01
  • Go FX框架用法小結

    Go FX框架用法小結

    Go FX是一個功能強大的框架,通過依賴注入和生命周期管理來簡化應用的構建與維護,本文就來介紹一下Go FX框架用法小結,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Golang協(xié)程中channel和sync的角色扮演分析

    Golang協(xié)程中channel和sync的角色扮演分析

    文章介紹了Go語言中的channel和sync包的作用,詳細說明了它們在協(xié)程通信、同步與協(xié)調(diào)以及避免共享狀態(tài)方面的重要性,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • golang微服務框架kratos實現(xiàn)Socket.IO服務的方法

    golang微服務框架kratos實現(xiàn)Socket.IO服務的方法

    本文主要介紹了golang微服務框架kratos實現(xiàn)Socket.IO服務的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Golang拾遺之指針和接口的使用詳解

    Golang拾遺之指針和接口的使用詳解

    拾遺主要是收集和golang相關的瑣碎知識,這篇文章主要是為大家整理了Golang中指針和接口的使用方法,文中的示例代碼講解詳細,需要的可以參考一下
    2023-02-02
  • Go的固定時長定時器和周期性時長定時器

    Go的固定時長定時器和周期性時長定時器

    本文主要介紹了Go的固定時長定時器和周期性時長定時器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺談golang通道類型

    淺談golang通道類型

    本文主要介紹了淺談golang通道類型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • golang 使用 viper 讀取自定義配置文件

    golang 使用 viper 讀取自定義配置文件

    這篇文章主要介紹了golang 使用 viper 讀取自定義配置文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 在Golang中實現(xiàn)RSA算法的加解密操作詳解

    在Golang中實現(xiàn)RSA算法的加解密操作詳解

    RSA 是一種非對稱加密算法,廣泛使用于數(shù)據(jù)的安全傳輸,crypto/rsa 是 Golang 中實現(xiàn)了 RSA 算法的一個標準庫,提供了生成公私鑰對、加解密數(shù)據(jù)、簽名和驗簽等功能,本文給大家介紹了在Golang中實現(xiàn)RSA算法的加解密操作,需要的朋友可以參考下
    2023-12-12

最新評論

英超| 开原市| 蕲春县| 盐山县| 桐庐县| 汨罗市| 伊宁市| 大兴区| 来宾市| 博野县| 江达县| 灌南县| 香港 | 上杭县| 广德县| 阜康市| 竹山县| 资源县| 福贡县| 繁峙县| 阿拉尔市| 淮北市| 翁牛特旗| 交口县| 万年县| 桂阳县| 读书| 临清市| 沁源县| 古田县| 南陵县| 虎林市| 辽宁省| 厦门市| 三亚市| 平乡县| 贵溪市| 昌宁县| 卓尼县| 绥化市| 阿拉尔市|