我想知道为什么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上找到示例代码
任何帮助都是非常感谢的。
发布于 2022-06-05 08:50:20
如果您查看来自go源代码的现有示例
// 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()
}参见此操场实例
[Error in L4]: Wrap L3Err [ErrorC in L3]: Wrap L2Err: [Error in L2]: Wrap L1Err [Error in L1]: Boomhttps://stackoverflow.com/questions/72505935
复制相似问题