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

Go errors默認加堆棧信息的作用分析

 更新時間:2023年12月08日 08:56:03   作者:煎魚  
這篇文章主要為大家介紹了Go errors默認加堆棧信息作用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

背景

在 Go 語言中,錯誤處理是我們必須涉及和爭議比較大的一個功能特性。今天我們不太探討 if err != nil 的繁雜憂愁。

聚焦在 errors 標準庫在排查、定位問題的訴求上??纯创蠹移綍r都是怎么做的。

平時我們在返回和處理錯誤時,一般使用 errors 標準庫。其支持以下幾個 API:

func As(err error, target any) bool
func Is(err, target error) bool
func Join(errs ...error) error
func New(text string) error
func Unwrap(err error) error

最簡單的 Demo 如下:

func main() {
    err := errors.New("煎魚出現(xiàn)錯誤了!")
    if err != nil {
        fmt.Println(err)
    }
}

輸出結果:

煎魚出現(xiàn)錯誤了!

看著非?;A,也沒什么特別的。但如果是在生產(chǎn)等正式環(huán)境下出問題時,可能就沒法這么愉快了。

但比較頭疼的是:其錯誤信息缺乏了調(diào)用堆棧,在復雜程序下,你很難直觀的知道是具體哪些關聯(lián)的代碼導致出現(xiàn)了這個報錯。只能靠在代碼中搜錯誤的文本,去猜測應該是這里的問題。

第三方庫解決

因此很多同學會使用第三方的開源庫 go-errors/errors。以下是他的簡單代碼演示:

import (
    "fmt"
    "github.com/go-errors/errors"
)
var Crashed = errors.Errorf("煎魚變炸魚了!")
func Crash() error {
    return errors.New(Crashed)
}
func main() {
    err := Crash()
    if err != nil {
        fmt.Println(err.(*errors.Error).ErrorStack())
        return
    }
}

輸出結果:

$ go run main.go
*errors.Error 煎魚變炸魚了!
/Users/eddycjy/app/go/demo1/main.go:12 (0x1090645)
    main: return errors.New(Crashed)
/Users/eddycjy/app/go/demo1/main.go:12 (0x1090636)
    Crash: return errors.New(Crashed)
/usr/local/Cellar/go/1.21.1/libexec/src/runtime/internal/atomic/types.go:194 (0x103305b)
    (*Uint32).Load: return Load(&u.value)
/usr/local/Cellar/go/1.21.1/libexec/src/runtime/asm_amd64.s:1650 (0x105d501)
    goexit: BYTE    $0x90    // NOP

該庫會默認記錄 ErrorStack 并且可以通過相應的方法。

新提案

前面提到的問題和解決方案,一直有人在提和重復造新的輪子。最近 Go 核心團隊 @Ian Lance Taylor 提出了新的提案《proposal: errors: let GODEBUG=errstacktrace request stack backtraces》希望以此解決這個問題。

在提案中計劃:增加一個新的 Go 運行時選項:GODEBUG=errstacktrace。

在環(huán)境中設置該 GODEBUG 項后,errors.New 和 fmt.Errorf 函數(shù)將發(fā)生變化,將堆棧跟蹤納入信息中。

新補充的堆棧跟蹤將成為 Error 方法返回的字符串的一部分,將會是一個多行的字符串內(nèi)容。

總結

Go 的 errors 總是紛紛擾擾,本次的提案也是拉扯了多年的結果。本次是想往 GODEBUG 上做開關選項,但也有許多同學想在編譯時就能指定,不用每次配一堆 GODEBUG。(雖然實際效果差不多)

整體來講,這個需求如果能夠落地,還是不錯的。能夠解決一些缺失調(diào)用堆棧,不太能明確錯誤拋出在哪的小麻煩。也能解決一些第三方庫存在原因,不用再額外維護了。

以上就是Go errors默認加堆棧信息的作用分析的詳細內(nèi)容,更多關于Go errors堆棧信息的資料請關注腳本之家其它相關文章!

相關文章

  • Golang實現(xiàn)短網(wǎng)址/短鏈服務的開發(fā)筆記分享

    Golang實現(xiàn)短網(wǎng)址/短鏈服務的開發(fā)筆記分享

    這篇文章主要為大家詳細介紹了如何使用Golang實現(xiàn)短網(wǎng)址/短鏈服務,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-05-05
  • Go語言計算指定年月天數(shù)的方法

    Go語言計算指定年月天數(shù)的方法

    這篇文章主要介紹了Go語言計算指定年月天數(shù)的方法,實例分析了Go語言操作時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • golang實現(xiàn)對JavaScript代碼混淆

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

    在Go語言中,你可以使用一些工具來混淆JavaScript代碼,一個常用的工具是Terser,它可以用于壓縮和混淆JavaScript代碼,你可以通過Go語言的`os/exec`包來調(diào)用Terser工具,本文給通過一個簡單的示例給大家介紹一下,感興趣的朋友可以參考下
    2024-01-01
  • Golang實現(xiàn)Redis網(wǎng)絡協(xié)議實例探究

    Golang實現(xiàn)Redis網(wǎng)絡協(xié)議實例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)Redis網(wǎng)絡協(xié)議實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 一文詳解如何使用Go語言生成二維碼

    一文詳解如何使用Go語言生成二維碼

    使用Go語言編程時,生成任意內(nèi)容的二維碼是非常方便的,下面這篇文章主要給大家介紹了關于如何使用Go語言生成二維碼的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Go語言實現(xiàn)枚舉的示例代碼

    Go語言實現(xiàn)枚舉的示例代碼

    本文主要介紹了Go語言實現(xiàn)枚舉的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 一個簡單的Golang實現(xiàn)的HTTP Proxy方法

    一個簡單的Golang實現(xiàn)的HTTP Proxy方法

    今天小編就為大家分享一篇一個簡單的Golang實現(xiàn)的HTTP Proxy方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • golang的time包:秒、毫秒、納秒時間戳輸出方式

    golang的time包:秒、毫秒、納秒時間戳輸出方式

    這篇文章主要介紹了golang的time包:秒、毫秒、納秒時間戳輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言string,int,int64 ,float之間類型轉換方法

    Go語言string,int,int64 ,float之間類型轉換方法

    Go語言中int類型和string類型都是屬于基本數(shù)據(jù)類型,兩種類型的轉化都非常簡單。下面通過本文給大家分享Go語言string,int,int64 ,float之間類型轉換方法,感興趣的朋友一起看看吧
    2017-07-07
  • Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解

    Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解

    這篇文章主要為大家介紹了Go語言處理超大字符串型整數(shù)加減經(jīng)典面試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10

最新評論