gpt4 book ai didi

go - fmt.Println() 在包装的自定义错误处停止打印链 (golang)

转载 作者:行者123 更新时间:2023-12-05 04:28:50 25 4
gpt4 key购买 nike

我想知道为什么 Go/golang 中的 fmt.Println() 确实打印了一些错误链的所有错误,而当所有错误链中的错误都是用 创建的fmt.Errorf()。但是,当这些错误之一是自定义错误(也换行)时,fmt.Println() 会在自定义错误位置停止展开和打印错误链。

这里是一些简化的示例代码:

type CustomError struct {
Msg string
Err error
}

func (e *CustomError) Error() string {
return e.Msg
}

func (e *CustomError) Unwrap() error {
return e.Err
}

func main() {
level1Err := errors.New("[Error in L1]: Boom")
level2Err := fmt.Errorf("[Error in L2]: Wrap L1Err %w", level1Err)
level3Err := fmt.Errorf("[Error in L3]: Wrap L2Err %w", level2Err)
//level3Err := &CustomError{"[Error in L3]: Wrap L2Err", level2Err}
level4Err := fmt.Errorf("[Error in L4]: Wrap L3Err %w", level3Err)
fmt.Println(level4Err)
}

// Console output, when uncomment line28 and comment line29:
// [Error in L4]: Wrap L3Err [Error in L3]: Wrap L2Err [Error in L2]: Wrap L1Err [Error in L1]: Boom

// Console output, when uncomment line29 and comment line28:
// [Error in L4]: Wrap L3Err [Error in L3]: Wrap L2Err

使用 Go 1.18

您还可以在 https://github.com/MBODM/golang-error-chains-problem 找到示例代码

非常感谢任何帮助

最佳答案

如果您查看 go source code 中的现有示例:

// SyscallError records an error from a specific system call.
type SyscallError struct {
Syscall string
Err error
}

func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() }

func (e *SyscallError) Unwrap() error { return e.Err }

所以你的CustomError#Error()方法应该是:

func (e *CustomError) Error() string {
if e.Err == nil {
return e.Msg
}
return e.Msg + ": " + e.Err.Error()
}

查看此 playground example :

[Error in L4]: Wrap L3Err [ErrorC in L3]: Wrap L2Err: [Error in L2]: Wrap L1Err [Error in L1]: Boom

关于go - fmt.Println() 在包装的自定义错误处停止打印链 (golang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72505935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com