W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
標(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
?方法我們可以判斷給定的?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
?方法我們可以獲得?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)前層級(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
?方法用于獲取層級(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
?對(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
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: