英文:
Go - errors.As failing to unwrap custom error type
问题
我正在尝试使用Go标准库中的errors包,使用errors.As
来解包一个自定义的错误类型,但似乎检查失败,无法提取底层错误。
我提取了一个最小的可复现示例:
package main
import (
"errors"
"fmt"
)
type myError struct {
err error
}
func (m myError) Error() string {
return fmt.Sprintf("my error: %s", m.err)
}
func retError() error {
return &myError{errors.New("wrapped")}
}
func main() {
var m myError
if err := retError(); errors.As(err, &m) {
fmt.Println("unwrapped", m.err)
} else {
fmt.Println(err)
}
}
https://go.dev/play/p/I7BNk4-rDIB - 这是在Go Playground上的示例。如果运行,它将打印出"my error: wrapped"而不是预期的"unwrapped wrapped"。
errors.As
文档中的示例可以正常工作,我似乎无法理解我做错了什么 - 我将*myError
传递给了errors.As
,这似乎是正确的(因为将myError
传递给它会引发恐慌:"目标必须是非nil指针",这是预期的行为)。
英文:
I'm trying to use the Go stdlib package errors to unwrap a custom error type using errors.As
, however it seems as though the check is failing and I cannot extract the underlying error.
I've extracted a minimal reproducible example:
package main
import (
"errors"
"fmt"
)
type myError struct {
err error
}
func (m myError) Error() string {
return fmt.Sprintf("my error: %s", m.err)
}
func retError() error {
return &myError{errors.New("wrapped")}
}
func main() {
var m myError
if err := retError(); errors.As(err, &m) {
fmt.Println("unwrapped", m.err)
} else {
fmt.Println(err)
}
}
https://go.dev/play/p/I7BNk4-rDIB - the example on the Go playground. If launched, it will print "my error: wrapped" instead of the expected "unwrapped wrapped".
The example from the errors.As
documentation works, and I can't seem to understand what am I doing incorrectly - I'm passing a *myError
to errors.As
, which seems to be correct (since passing a myError
raises a panic: target must be a non-nil pointer
, which is expected).
答案1
得分: 0
将代码中的注释翻译为中文:
改为:
func retError() error {
return myError{errors.New("wrapped")}
}
英文:
Instead of:
func retError() error {
return &myError{errors.New("wrapped")}
}
Do:
func retError() error {
return myError{errors.New("wrapped")}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论