Go Error 嵌套到底是怎么实现的?
Go语言中实现错误嵌套通常是通过errors.New
创建一个新的错误,并使用fmt.Errorf
来格式化字符串并附加到原始错误上,从而形成错误链。这样可以保留原始错误信息,并能通过错误接口提供的Unwrap方法追踪到最初的错误原因。
以下是一个简单的示例:
package main
import (
"errors"
"fmt"
)
func main() {
err := process()
if err != nil {
fmt.Println("Error:", err)
}
}
func process() error {
err := step1()
if err != nil {
return fmt.Errorf("step1 failed: %w", err)
}
err = step2()
if err != nil {
return fmt.Errorf("step2 failed: %w", err)
}
return nil
}
func step1() error {
return errors.New("something went wrong in step1")
}
func step2() error {
err := errors.New("something went wrong in step2")
return fmt.Errorf("step2 error: %w", err)
}
在上面的代码中,process
函数中的每一步错误都被格式化并附加到一个新的错误信息中,使用%w
格式说明符来嵌套原始错误。在main
函数中,当错误发生时,可以通过fmt.Errorf
的%+v
或%w
格式说明符来输出完整的错误堆栈。
要检查嵌套的错误,可以使用errors.Is
或errors.As
函数来检查是否存在特定类型的错误。errors.Is
会检查直接的原因,而errors.As
可以用来检查更深层次的原因。
if errors.Is(err, ErrTimeout) {
// 处理超时错误
}
var innerErr *os.PathError
if errors.As(err, &innerErr) {
// 处理具体的PathError错误
}
评论已关闭