GoFrame 錯(cuò)誤處理-堆棧特性

2022-03-30 09:35 更新

錯(cuò)誤堆棧

標(biāo)準(zhǔn)庫的?error?錯(cuò)誤實(shí)現(xiàn)比較簡單,無法進(jìn)行堆棧追溯,對(duì)于產(chǎn)生錯(cuò)誤時(shí)的上層調(diào)用者來講不是很友好,無法獲得錯(cuò)誤的調(diào)用鏈詳細(xì)信息。?gerror?支持錯(cuò)誤堆棧記錄,通過?New/Newf?、?Wrap/Wrapf?等方法均會(huì)自動(dòng)記錄當(dāng)前錯(cuò)誤產(chǎn)生時(shí)的堆棧信息。

示例:

package main

import (
	"fmt"
	"github.com/gogf/gf/v2/errors/gerror"
)

func OpenFile() error {
	return gerror.New("permission denied")
}

func OpenConfig() error {
	return gerror.Wrap(OpenFile(), "configuration file opening failed")
}

func ReadConfig() error {
	return gerror.Wrap(OpenConfig(), "reading configuration failed")
}

func main() {
	fmt.Printf("%+v", ReadConfig())
}

// Output:
// reading configuration failed: configuration file opening failed: permission denied
// 1. reading configuration failed
//     1). main.ReadConfig
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:18
//     2). main.main
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:25
// 2. configuration file opening failed
//     1). main.OpenConfig
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:14
//     2). main.ReadConfig
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:18
//     3). main.main
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:25
// 3. permission denied
//     1). main.OpenFile
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:10
//     2). main.OpenConfig
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:14
//     3). main.ReadConfig
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:18
//     4). main.main
//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/v2/geg/errors/gerror/gerror2.go:25

可以看到,調(diào)用端可以通過?Wrap?方法將底層的錯(cuò)誤信息進(jìn)行層級(jí)疊加,并且包含完整的錯(cuò)誤堆棧信息。

HasStack 判斷是否實(shí)現(xiàn)堆棧

  • 說明:通過?HasStack?方法我們可以判斷給定的?error?接口對(duì)象是否實(shí)現(xiàn)(包含)了堆棧信息。
  • 格式:

HasStack(err error) bool

  • 示例:

func ExampleHasStack() {
	err1 := errors.New("sql error")
	err2 := gerror.New("write error")
	fmt.Println(gerror.HasStack(err1))
	fmt.Println(gerror.HasStack(err2))

	// Output:
	// false
	// true
}

Stack 獲取堆棧信息

  • 說明:通過?Stack?方法我們可以獲得?error?對(duì)象的完整堆棧信息,返回堆棧列表字符串。 注意參數(shù)為標(biāo)準(zhǔn)庫?error?類型,當(dāng)該參數(shù)為?gerror?模塊生成的?error?時(shí), 或者開發(fā)者自定義的?error?對(duì)象實(shí)現(xiàn)了該接口時(shí)支持打印,否則,返回空字符串。
  • 格式:

Stack(err error) string

  • 示例:

func ExampleStack() {
 	var err error
	err = errors.New("sql error")
	err = gerror.Wrap(err, "adding failed")
	err = gerror.Wrap(err, "api calling failed")
	fmt.Println(gerror.Stack(err))

	// Output:
	// 1. api calling failed
	//     1).  main.main
	//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/other/test.go:14
	// 2. adding failed
	//     1).  main.main
	//         /Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/other/test.go:13
	// 3. sql error
}

Current 獲取當(dāng)前error

  • 說明:?Current?方法用于獲取當(dāng)前層級(jí)的錯(cuò)誤信息,通過?error?接口對(duì)象返回。
  • 格式:

Current(err error) error

  • 示例:

func ExampleCurrent() {
  	var err error
	err = errors.New("sql error")
	err = gerror.Wrap(err, "adding failed")
	err = gerror.Wrap(err, "api calling failed")
	fmt.Println(err)
	fmt.Println(gerror.Current(err))

	// Output:
	// api calling failed: adding failed: sql error
	// api calling failed
}

Next 獲取下一層error

  • 說明:?Next?方法用于獲取層級(jí)錯(cuò)誤的下一級(jí)錯(cuò)誤?error?接口對(duì)象。當(dāng)下一層級(jí)不存在時(shí),返回?nil?。
  • 格式:

Next(err error) error

  • 示例:

func ExampleNext() {
	var err error
	err = errors.New("sql error")
	err = gerror.Wrap(err, "adding failed")
	err = gerror.Wrap(err, "api calling failed")

	fmt.Println(err)

	err = gerror.Next(err)
	fmt.Println(err)

	err = gerror.Next(err)
	fmt.Println(err)

	// Output:
	// api calling failed: adding failed: sql error
	// adding failed: sql error
	// sql error
}

Cause 獲取根error

  • 說明:通過?Cause?方法我們可以獲得?error?對(duì)象的根錯(cuò)誤信息(原始錯(cuò)誤)。 注意參數(shù)為標(biāo)準(zhǔn)庫?error?類型,當(dāng)該參數(shù)為?gerror?模塊生成的?error?時(shí), 或者開發(fā)者自定義的?error?對(duì)象實(shí)現(xiàn)了該接口方法時(shí)支持打印,否則,返回輸出的?error?對(duì)象。
  • 格式:

Next(err error) error

  • 示例:

package main

import (
	"fmt"
	"github.com/gogf/gf/v2/errors/gerror"
)

func OpenFile() error {
	return gerror.New("permission denied")
}

func OpenConfig() error {
	return gerror.Wrap(OpenFile(), "configuration file opening failed")
}

func ReadConfig() error {
	return gerror.Wrap(OpenConfig(), "reading configuration failed")
}

func main() {
	fmt.Println(gerror.Cause(ReadConfig()))
}

// Output:
// permission denied


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)