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

Go語(yǔ)言中實(shí)現(xiàn)打印堆棧的errors包的用法詳解

 更新時(shí)間:2023年07月02日 11:23:31   作者:242030  
因?yàn)镚o語(yǔ)言提供的錯(cuò)誤太簡(jiǎn)單了,以至于簡(jiǎn)單的我們無(wú)法更好的處理問(wèn)題,所以誕生了很多對(duì)錯(cuò)誤處理的庫(kù),github.com/pkg/errors是比較簡(jiǎn)潔的一樣,本文就來(lái)聊聊它的具體用法吧

Go語(yǔ)言打印堆棧errors包

因?yàn)镚o語(yǔ)言提供的錯(cuò)誤太簡(jiǎn)單了,以至于簡(jiǎn)單的我們無(wú)法更好的處理問(wèn)題,甚至不能為我們處理錯(cuò)誤,提供更有用的信息,所以誕生了很多對(duì)錯(cuò)誤處理的庫(kù),github.com/pkg/errors是比較簡(jiǎn)潔的一樣,并且功能非常強(qiáng)大,受到了大量開(kāi)發(fā)者的歡迎,使用者很多。

1、安裝

go get github.com/pkg/errors

2、使用

跟蹤堆棧信息的函數(shù)使用:

// 新生成一個(gè)錯(cuò)誤, 帶堆棧信息
func New(message string) error
//只附加新的信息
func WithMessage(err error, message string) error
//只附加調(diào)用堆棧信息
func WithStack(err error) error
//同時(shí)附加堆棧和信息
func Wrap(err error, message string) error

打印出堆棧信息:

// 功能一樣,輸出錯(cuò)誤信息,不包含堆棧
%s,%v 
// 輸出的錯(cuò)誤信息帶引號(hào),不包含堆棧
%q 
// 輸出錯(cuò)誤信息和堆棧
%+v 
//如:
fmt.Println(fmt.Sprintf("%s", err))
fmt.Println(fmt.Sprintf("%q", err))
fmt.Println(fmt.Sprintf("%+v", err))

2.1 New()函數(shù)

它的使用非常簡(jiǎn)單,如果我們要新生成一個(gè)錯(cuò)誤,可以使用 New 函數(shù)生成錯(cuò)誤,自帶調(diào)用堆棧信息。

// 例子
package main
import (
	"fmt"
	"github.com/pkg/errors"
)
func main() {
	result, err := Divide(10, 0)
	if err != nil {
		fmt.Println(fmt.Sprintf("error1: %v", err))
		fmt.Println(fmt.Sprintf("error2: %s", err))
		fmt.Println(fmt.Sprintf("error3: %q", err))
		fmt.Println(fmt.Sprintf("error4: %+v", err))
	} else {
		fmt.Println("result:", result)
	}
}
func Divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.New("division can not 0")
	} else {
		return a / b, nil
	}
}

程序輸出

error1: division can not 0
error2: division can not 0
error3: "division can not 0"
error4: division can not 0
main.Divide
        C:/Users/admin/Desktop/gg/new/go-errors/001.go:23
main.main
        C:/Users/admin/Desktop/gg/new/go-errors/001.go:10
runtime.main
        D:/install/go1.18.4/src/runtime/proc.go:250
runtime.goexit
        D:/install/go1.18.4/src/runtime/asm_amd64.s:1571

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

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

2.2 WithMessage()函數(shù)

// 例子
package main
import (
	"fmt"
	"github.com/pkg/errors"
)
func main() {
	result, err := Divide(10, 0)
	if err != nil {
		fmt.Println(fmt.Sprintf("error1: %v", err))
		fmt.Println(fmt.Sprintf("error2: %s", err))
		fmt.Println(fmt.Sprintf("error3: %q", err))
		fmt.Println(fmt.Sprintf("error4: %+v", err))
	} else {
		fmt.Println("result:", result)
	}
}
func Divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.WithMessage(errors.New("division can not 0"),"func Divide(a, b int) (int, error) {}")
	} else {
		return a / b, nil
	}
}

程序輸出

error1: func Divide(a, b int) (int, error) {}: division can not 0
error2: func Divide(a, b int) (int, error) {}: division can not 0
error3: func Divide(a, b int) (int, error) {}: division can not 0
error4: division can not 0
main.Divide
        C:/Users/admin/Desktop/gg/new/go-errors/002.go:23
main.main
        C:/Users/admin/Desktop/gg/new/go-errors/002.go:10
runtime.main
        D:/install/go1.18.4/src/runtime/proc.go:250
runtime.goexit
        D:/install/go1.18.4/src/runtime/asm_amd64.s:1571
func Divide(a, b int) (int, error) {}

2.3 WithStack()

// 例子
package main
import (
	"fmt"
	"github.com/pkg/errors"
)
func main() {
	result, err := Divide(10, 0)
	if err != nil {
		fmt.Println(fmt.Sprintf("error1: %v", err))
		fmt.Println(fmt.Sprintf("error2: %s", err))
		fmt.Println(fmt.Sprintf("error3: %q", err))
		fmt.Println(fmt.Sprintf("error4: %+v", err))
	} else {
		fmt.Println("result:", result)
	}
}
func Divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.WithStack(errors.New("division can not 0"))
	} else {
		return a / b, nil
	}
}

程序輸出

error1: division can not 0
error2: division can not 0
error3: "division can not 0"
error4: division can not 0
main.Divide
        C:/Users/admin/Desktop/gg/new/go-errors/003.go:23
main.main
        C:/Users/admin/Desktop/gg/new/go-errors/003.go:10
runtime.main
        D:/install/go1.18.4/src/runtime/proc.go:250
runtime.goexit
        D:/install/go1.18.4/src/runtime/asm_amd64.s:1571
main.Divide
        C:/Users/admin/Desktop/gg/new/go-errors/003.go:23
main.main
        C:/Users/admin/Desktop/gg/new/go-errors/003.go:10
runtime.main
        D:/install/go1.18.4/src/runtime/proc.go:250
runtime.goexit
        D:/install/go1.18.4/src/runtime/asm_amd64.s:1571

2.4 Wrap()函數(shù)

// 例子
package main
import (
	"fmt"
	"github.com/pkg/errors"
)
func main() {
	result, err := Divide(10, 0)
	if err != nil {
		fmt.Println(fmt.Sprintf("error1: %v", err))
		fmt.Println(fmt.Sprintf("error2: %s", err))
		fmt.Println(fmt.Sprintf("error3: %q", err))
		fmt.Println(fmt.Sprintf("error4: %+v", err))
	} else {
		fmt.Println("result:", result)
	}
}
func Divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.Wrap(errors.New("division can not 0"),"func Divide(a, b int) (int, error){}")
	} else {
		return a / b, nil
	}
}

程序輸出

error1: func Divide(a, b int) (int, error){}: division can not 0
error2: func Divide(a, b int) (int, error){}: division can not 0
error3: "func Divide(a, b int) (int, error){}: division can not 0"
error4: division can not 0
main.Divide
        C:/Users/admin/Desktop/gg/new/go-errors/004.go:23
main.main
        C:/Users/admin/Desktop/gg/new/go-errors/004.go:10
runtime.main
        D:/install/go1.18.4/src/runtime/proc.go:250
runtime.goexit
        D:/install/go1.18.4/src/runtime/asm_amd64.s:1571
func Divide(a, b int) (int, error){}
main.Divide
        C:/Users/admin/Desktop/gg/new/go-errors/004.go:23
main.main
        C:/Users/admin/Desktop/gg/new/go-errors/004.go:10
runtime.main
        D:/install/go1.18.4/src/runtime/proc.go:250
runtime.goexit
        D:/install/go1.18.4/src/runtime/asm_amd64.s:1571

這里只是簡(jiǎn)單介紹相關(guān)函數(shù)的使用,我們可以自己對(duì)這些函數(shù)進(jìn)行封裝,然后在相應(yīng)的地方進(jìn)行調(diào)用。

3、總結(jié)

通過(guò)使用這個(gè) github.com/pkg/errors 錯(cuò)誤庫(kù),我們可以收集更多的信息,可以讓我們更容易的定位問(wèn)題。

我們收集的這些信息不止可以輸出到控制臺(tái),也可以當(dāng)做日志,使用輸出到相應(yīng)的 Log 日志里,便于分析問(wèn)題。

以上就是Go語(yǔ)言中實(shí)現(xiàn)打印堆棧的errors包的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言打印堆棧errors包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Gin框架中解決跨域問(wèn)題的多種方法

    在Gin框架中解決跨域問(wèn)題的多種方法

    在使用Go語(yǔ)言進(jìn)行Web開(kāi)發(fā)時(shí),Gin框架因其簡(jiǎn)潔、高效的特點(diǎn)而被廣泛使用,然而,在實(shí)際開(kāi)發(fā)中,跨域問(wèn)題(CORS, Cross-Origin Resource Sharing)是一個(gè)常見(jiàn)的挑戰(zhàn),本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Gin框架中解決跨域問(wèn)題的多種方法,需要的朋友可以參考下
    2024-10-10
  • 詳解Golang中字符串的使用

    詳解Golang中字符串的使用

    這篇文章主要為大家詳細(xì)介紹了Golang中字符串的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定的幫助,感興趣的小伙伴可以了解一下
    2022-10-10
  • Golang使用Channel組建高并發(fā)HTTP服務(wù)器

    Golang使用Channel組建高并發(fā)HTTP服務(wù)器

    Golang 作為一門(mén)高效的語(yǔ)言,在網(wǎng)絡(luò)編程方面表現(xiàn)也非常出色,這篇文章主要介紹了如何使用 Golang 和 Channel 組建高并發(fā) HTTP 服務(wù)器,感興趣的可以了解一下
    2023-06-06
  • 成功安裝vscode中g(shù)o的相關(guān)插件(詳細(xì)教程)

    成功安裝vscode中g(shù)o的相關(guān)插件(詳細(xì)教程)

    這篇文章主要介紹了成功安裝vscode中g(shù)o的相關(guān)插件的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Prometheus Go client library使用方式詳解

    Prometheus Go client library使用方式詳解

    這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 淺析Golang中變量與常量的聲明與使用

    淺析Golang中變量與常量的聲明與使用

    變量、常量的聲明與使用是掌握一門(mén)編程語(yǔ)言的基礎(chǔ),這篇文章主要為大家詳細(xì)介紹了Golang中變量與常量的聲明與使用,需要的可以參考一下
    2023-04-04
  • Go語(yǔ)言中零拷貝的原理與實(shí)現(xiàn)詳解

    Go語(yǔ)言中零拷貝的原理與實(shí)現(xiàn)詳解

    零拷貝是相對(duì)于用戶(hù)態(tài)來(lái)講的,即數(shù)據(jù)在用戶(hù)態(tài)不發(fā)生任何拷貝,那么零拷貝的原理是什么,又是如何實(shí)現(xiàn)的呢,下面小編就來(lái)和大家詳細(xì)聊聊吧
    2023-08-08
  • Go Slice擴(kuò)容的這些坑你踩過(guò)哪些

    Go Slice擴(kuò)容的這些坑你踩過(guò)哪些

    這篇文章主要為大家詳細(xì)介紹了Golang中對(duì)切片Slice的append操作時(shí)會(huì)遇到的踩坑經(jīng)驗(yàn)分享,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • go程序測(cè)試CPU占用率統(tǒng)計(jì)ps?vs?top兩種不同方式對(duì)比

    go程序測(cè)試CPU占用率統(tǒng)計(jì)ps?vs?top兩種不同方式對(duì)比

    這篇文章主要為大家介紹了go程序測(cè)試CPU占用率統(tǒng)計(jì)ps?vs?top兩種不同方式對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • golang 實(shí)現(xiàn)時(shí)間戳和時(shí)間的轉(zhuǎn)化

    golang 實(shí)現(xiàn)時(shí)間戳和時(shí)間的轉(zhuǎn)化

    這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間戳和時(shí)間的轉(zhuǎn)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論