英文:
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") {
// 在 URL 字符串中添加协议方案
}
我尝试了 fmt.Printf("%#v", err)
,得到的结果是:
&url.Error{Op:"Get", URL:"google.com", Err:(*errors.errorString)(0xc000098c40)}
fmt.Printf("%T")
得到的结果是:
*url.Error
编辑:如果你给我点踩,我真的希望你能留下评论,告诉我你的想法。
英文:
If you do this:
_, err := http.Get("google.com")
if err != nil {
log.Fatal(err)
}
you get the output:
2021/08/05 15:42:18 Get "google.com": unsupported protocol scheme ""
I'm wondering how do I get the type of error, so I can handle the error like so:
if errors.Is(err, "unsupported protocol scheme") {
//add protocol scheme to url string
}
I've tried fmt.Printf("%#v", err), which gives:
&url.Error{Op:"Get", URL:"google.com", Err:(*errors.errorString)(0xc000098c40)}
fmt.Printf("%T") gives:
*url.Error
Edit: If you're downvoting, I'd really appreciate a comment with your thoughts.
答案1
得分: 3
var e *url.Error
if errors.As(err, &e) && strings.HasPrefix(e.Err.Error(), "unsupported protocol scheme") {
//在URL字符串中添加协议方案
}
请注意,与非标准化字符串进行比较不应被视为具有未来性。例如,如果Go的未来版本决定更改该错误消息的措辞,您的代码将会出错。
尽管Go承诺在不同版本之间保持兼容性,但我认为这个承诺不包括字符串内容。
英文:
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
Note that comparison against non-standardized strings should not be considered future-proof. For example if a future version of Go decides to change the wording of that error message your code will break.
Although Go does promise compatibility across versions, I don't think that that promise extends to string content.
答案2
得分: 0
你可以使用err.Error()
来返回字符串。
并且检查它是否包含特定的键,类似于这样:
if err = db.Ping(); err != nil {
switch {
case strings.Contains(err.Error(), "connection refused"):
// 处理连接被拒绝的情况。例如:
cmd := exec.Command("sudo", "service", "mariadb", "start")
_ = cmd.Run()
default:
log.Println("未知类型的错误", err)
}
}
在你的情况下,你可以尝试类似这样的代码:
err := http.Get(url)
if strings.Contains(err.Error(), "unsupported protocol scheme") {
// 将协议方案添加到url字符串中
}
英文:
you can use err.Error()
to return string.
and check if it contiane a spicifice keys, something like this:
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)
}
}
in your case you can try somthing like:
err := http.Get(url)
if strings.Contains(err.Error(), "unsupported protocol scheme") {
//add protocol scheme to url string
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论