欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

go語言中的錯誤處理機制-創(chuàng)新互聯(lián)

基礎(chǔ)

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司是一家服務(wù)多年做網(wǎng)站建設(shè)策劃設(shè)計制作的公司,為廣大用戶提供了網(wǎng)站制作、成都做網(wǎng)站,成都網(wǎng)站設(shè)計,1元廣告,成都做網(wǎng)站選創(chuàng)新互聯(lián),貼合企業(yè)需求,高性價比,滿足客戶不同層次的需求一站式服務(wù)歡迎致電。

錯誤處理應(yīng)該是工程的一部分,Golang中的error是一個interface類型,如下:

type error interface {
	Error() string
}

凡是實現(xiàn)Error()方法的結(jié)構(gòu),都可以作為錯誤處理。因此如果函數(shù)可能出現(xiàn)錯誤,那么可以在返回值的最后,返回一個錯誤,比如:

func foo() error {
	// ... do something
	return errors.New("foo error")
}

直接返回錯誤

直接返回錯誤,類似于直接返回字符串類型的錯誤,或者錯誤碼之類的。字符串類型的錯誤,在基礎(chǔ)部分提到了。錯誤碼相當于Linux、C編程中的錯誤碼,一般我們需要自己定義。舉個例子:

package mypkg

type ErrCode int

const (
	ERR1 = 1
	ERR2 = 2
	ERR3 = 3
)

func sub(a, b int) (int, ErrCode) {
	if b < 0 {
		return 0, ERR1
	} else if a < b {
		return 0, Err2
	} else if a < 0 {
		return 0, Err3
	}
	return a - b
}

這種類型的錯誤,編寫簡單,但是有兩個缺陷:

1、外層如果想要使用錯誤碼,則需要引入這個包,容易出現(xiàn)循環(huán)引用的情況。

2、如果包內(nèi)部修改返回的錯誤碼類型,則外部使用到錯誤碼的地方,都要進行相應(yīng)的修改,破壞了封閉性。

對于第一個缺陷,可以使用一個第三方的包,專門存放錯誤碼,這個方式值得商榷。永遠不要通過判斷Error()方法返回的字符串的值,來進行對應(yīng)的錯誤處理!??!

返回自定義類型的錯誤

該方式可以返回自定義的類型,并通過斷言自定義類型,來進行有關(guān)的錯誤處理;自定義類型可以攜帶更多的信息,代碼實例:

package main

import (
	"errors"
	"fmt"
	"runtime/debug"
)

type MyError struct {
	Inner      error                  // 內(nèi)粗錯誤
	Message    string                 // 自定義錯誤信息
	StackTrace string                 // 堆棧信息
	Misc       map[string]interface{} //其它的一些數(shù)據(jù)
}

func (myError MyError) Error() string {
	return myError.Message
}

func wrapError(err error, msg string, msgArgs ...interface{}) MyError {
	return MyError{
		Inner:      err,
		Message:    fmt.Sprintf(msg, msgArgs),
		StackTrace: string(debug.Stack()),
		Misc:       make(map[string]interface{}),
	}
}

func Handle(key int) error {
	if key < 0 {
		return wrapError(errors.New("key < 0"), "This is an error test")
	}
	return nil
}

func main() {
	if err := Handle(-1); err != nil {
		if e, ok := err.(MyError); ok {
			fmt.Printf("Inner: %v, Message: %v, StackTrace: %v\n",
				e.Inner, e.Message, e.StackTrace)  // 這里輸出對應(yīng)的數(shù)據(jù)
		}
	}
}

這種方式處理問題更加方便,但是仍然可能會有包循環(huán)引用的問題。

隱藏內(nèi)部細節(jié)的錯誤處理

上述兩種方式,可以適應(yīng)一些場景,不過都無法解決可能存在循環(huán)依賴的問題。為此,我們使用github.com/pkg/errors的包來解決問題,給出一個代碼實例。

func New(message string) error

如果有一個現(xiàn)成的error,我們需要對他進行再次包裝處理,這時候有三個函數(shù)可以選擇。

//只附加新的信息
func WithMessage(err error, message string) error
//只附加調(diào)用堆棧信息
func WithStack(err error) error
//同時附加堆棧和信息
func Wrap(err error, message string) error

其實上面的包裝,很類似于Java的異常包裝,被包裝的error,其實就是Cause,在前面的章節(jié)提到錯誤的根本原因,就是這個Cause。所以這個錯誤處理庫為我們提供了Cause函數(shù)讓我們可以獲得最根本的錯誤原因。

func Cause(err error) error {
	type causer interface {
		Cause() error
	}

	for err != nil {
		cause, ok := err.(causer)
		if !ok {
			break
		}
		err = cause.Cause()
	}
	return err
}

使用for循環(huán)一直找到最根本(最底層)的那個error。

以上就是關(guān)于golang中的錯誤處理機制的詳細介紹的詳細內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

網(wǎng)站欄目:go語言中的錯誤處理機制-創(chuàng)新互聯(lián)
文章URL:http://aaarwkj.com/article22/idpjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT網(wǎng)頁設(shè)計公司、動態(tài)網(wǎng)站、網(wǎng)站制作、服務(wù)器托管商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
久久精品国产亚洲七七| 婷婷色爱区综合五月激情| 国产传媒视频网站在线观看| 成年人收看黄色一二级片| 亚洲天堂av在线播放| 亚洲精品中文字幕码专区| 日韩中文字幕一区二区不卡| 欧美日韩台湾一区二区| 二区三区在线欧美日韩| 国产高清av免费观看| 亚洲av日韩专区在线观看| 中国亚洲视频一区二区| av剧情在线观看免费| 国产精品三级av在线播放| 亚洲女久久久噜噜噜综合| 精品中文字幕欧美区一区| 91老熟女露脸大合集| 日韩欧美的一区二区三区| 91麻豆国产在线视频| 少妇被啪出水在线视频| 日韩欧美国产亚洲在线| 中文字幕免费不卡一区| 亚洲综合色婷婷在线影院| 国产精品大白屁股视频| 日日干夜夜射天天操| 92午夜福利精品视频| 国产丝袜美腿在线观看| 欧美日韩精品综合国产| 五月婷婷六月丁香俺来也| 强乱人妻中文字幕日本| 在线免费观看国产黄色av| 日韩视频播放一区二区| 天天操天天夜夜操夜夜| 夫妻性生活免费的视频| 成人黄色一级电影免费看| 亚洲一区二区三区四区国产| 国产青草视频免观看视频| 国产女同一区二区三区久久| 国产精品一区二区三区 在线 | 亚洲av乱码专区国产乱码| 亚洲一区二区三区在线观看呢 |