日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame錯(cuò)誤處理-堆棧特性

錯(cuò)誤堆棧

標(biāo)準(zhǔn)庫(kù)的?error?錯(cuò)誤實(shí)現(xiàn)比較簡(jiǎn)單,無(wú)法進(jìn)行堆棧追溯,對(duì)于產(chǎn)生錯(cuò)誤時(shí)的上層調(diào)用者來(lái)講不是很友好,無(wú)法獲得錯(cuò)誤的調(diào)用鏈詳細(xì)信息。?gerror?支持錯(cuò)誤堆棧記錄,通過(guò)?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)用端可以通過(guò)?Wrap?方法將底層的錯(cuò)誤信息進(jìn)行層級(jí)疊加,并且包含完整的錯(cuò)誤堆棧信息。

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

  • 說(shuō)明:通過(guò)?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 獲取堆棧信息

  • 說(shuō)明:通過(guò)?Stack?方法我們可以獲得?error?對(duì)象的完整堆棧信息,返回堆棧列表字符串。 注意參數(shù)為標(biāo)準(zhǔn)庫(kù)?error?類(lèi)型,當(dāng)該參數(shù)為?gerror?模塊生成的?error?時(shí), 或者開(kāi)發(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

  • 說(shuō)明:?Current?方法用于獲取當(dāng)前層級(jí)的錯(cuò)誤信息,通過(guò)?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

  • 說(shuō)明:?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

  • 說(shuō)明:通過(guò)?Cause?方法我們可以獲得?error?對(duì)象的根錯(cuò)誤信息(原始錯(cuò)誤)。 注意參數(shù)為標(biāo)準(zhǔn)庫(kù)?error?類(lèi)型,當(dāng)該參數(shù)為?gerror?模塊生成的?error?時(shí), 或者開(kāi)發(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

當(dāng)前名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame錯(cuò)誤處理-堆棧特性
分享地址:http://www.5511xx.com/article/djjheoi.html