新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame錯誤處理-堆棧特性
錯誤堆棧
標準庫的?error?錯誤實現(xiàn)比較簡單,無法進行堆棧追溯,對于產(chǎn)生錯誤時的上層調(diào)用者來講不是很友好,無法獲得錯誤的調(diào)用鏈詳細信息。?gerror?支持錯誤堆棧記錄,通過?New/Newf?、?Wrap/Wrapf?等方法均會自動記錄當前錯誤產(chǎn)生時的堆棧信息。

示例:
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?方法將底層的錯誤信息進行層級疊加,并且包含完整的錯誤堆棧信息。
HasStack 判斷是否實現(xiàn)堆棧
- 說明:通過?
HasStack?方法我們可以判斷給定的?error?接口對象是否實現(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?對象的完整堆棧信息,返回堆棧列表字符串。 注意參數(shù)為標準庫?error?類型,當該參數(shù)為?gerror?模塊生成的?error?時, 或者開發(fā)者自定義的?error?對象實現(xiàn)了該接口時支持打印,否則,返回空字符串。 - 格式:
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 獲取當前error
- 說明:?
Current?方法用于獲取當前層級的錯誤信息,通過?error?接口對象返回。 - 格式:
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?方法用于獲取層級錯誤的下一級錯誤?error?接口對象。當下一層級不存在時,返回?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?對象的根錯誤信息(原始錯誤)。 注意參數(shù)為標準庫?error?類型,當該參數(shù)為?gerror?模塊生成的?error?時, 或者開發(fā)者自定義的?error?對象實現(xiàn)了該接口方法時支持打印,否則,返回輸出的?error?對象。 - 格式:
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 文章題目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame錯誤處理-堆棧特性
本文鏈接:http://fisionsoft.com.cn/article/djjheoi.html


咨詢
建站咨詢
