如何获取在错误处理中使用的错误类型
How to get the type of error to use in error handling
如果你这样做:
_, err := http.Get("google.com")
if err != nil {
log.Fatal(err)
}
你得到输出:
2021/08/05 15:42:18 Get "google.com": unsupported protocol scheme ""
我想知道如何获取错误类型,以便我可以像这样处理错误:
if errors.Is(err, "unsupported protocol scheme") {
//add protocol scheme to url string
}
我试过 fmt.Printf("%#v", err),结果是:
&url.Error{Op:"Get", URL:"google.com", Err:(*errors.errorString)(0xc000098c40)}
fmt.Printf("%T") 给出:
*url.Error
编辑:如果你不赞成,我非常感谢你的想法发表评论。
var e *url.Error
if errors.As(err, &e) && strings.HasPrefix(e.Err.Error(), "unsupported protocol scheme") {
//add protocol scheme to url string
}
https://play.golang.org/p/VKpMfrBp_EF
请注意,与非标准化字符串的比较不应被视为面向未来。例如,如果 Go 的未来版本决定更改该错误消息的措辞,您的代码将会中断。
尽管 Go 确实承诺跨版本的兼容性,但我认为该承诺不会扩展到字符串内容。
您可以使用 err.Error()
到 return 字符串。
并检查它是否包含特定的键,如下所示:
if err = db.Ping(); err != nil {
switch {
case strings.Contains(err.Error(), "connection refused"):
// handle connection refused. for example:
cmd := exec.Command("sudo", "service", "mariadb", "start")
_ = cmd.Run()
default:
log.Println("unknown kind of this error", err)
}
}
在您的情况下,您可以尝试以下操作:
err := http.Get(url)
if strings.Contains(err.Error(), "unsupported protocol scheme") {
//add protocol scheme to url string
}
如果你这样做:
_, err := http.Get("google.com")
if err != nil {
log.Fatal(err)
}
你得到输出:
2021/08/05 15:42:18 Get "google.com": unsupported protocol scheme ""
我想知道如何获取错误类型,以便我可以像这样处理错误:
if errors.Is(err, "unsupported protocol scheme") {
//add protocol scheme to url string
}
我试过 fmt.Printf("%#v", err),结果是:
&url.Error{Op:"Get", URL:"google.com", Err:(*errors.errorString)(0xc000098c40)}
fmt.Printf("%T") 给出:
*url.Error
编辑:如果你不赞成,我非常感谢你的想法发表评论。
var e *url.Error
if errors.As(err, &e) && strings.HasPrefix(e.Err.Error(), "unsupported protocol scheme") {
//add protocol scheme to url string
}
https://play.golang.org/p/VKpMfrBp_EF
请注意,与非标准化字符串的比较不应被视为面向未来。例如,如果 Go 的未来版本决定更改该错误消息的措辞,您的代码将会中断。
尽管 Go 确实承诺跨版本的兼容性,但我认为该承诺不会扩展到字符串内容。
您可以使用 err.Error()
到 return 字符串。
并检查它是否包含特定的键,如下所示:
if err = db.Ping(); err != nil {
switch {
case strings.Contains(err.Error(), "connection refused"):
// handle connection refused. for example:
cmd := exec.Command("sudo", "service", "mariadb", "start")
_ = cmd.Run()
default:
log.Println("unknown kind of this error", err)
}
}
在您的情况下,您可以尝试以下操作:
err := http.Get(url)
if strings.Contains(err.Error(), "unsupported protocol scheme") {
//add protocol scheme to url string
}