新聞中心
這里有您想知道的互聯(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


咨詢
建站咨詢
