登录
首页 >  Golang >  Go问答

golang中网络错误的正确处理方法是什么?

来源:stackoverflow

时间:2024-02-14 18:24:16 402浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《golang中网络错误的正确处理方法是什么?》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我不明白如何处理从网络包接收的错误。我需要知道发生了什么类型的错误才能执行下一步。尝试解析错误消息字符串可能不是正确的方法...

response, err := data.httpclient.get("https://" + domain)
if err != nil {             
    fmt.println("[!] error: ", err)
    /* 
    *  i want something like this in pseudo code:
    *  if error == dnslookuperror {
    *      action1()
    *  } else if error == tlscertificateerror {
    *      action2()
    *  } else if error == timeout {
    *      action3()
    *  } ...
    */
}

我收到的错误消息例如:

Get "https://example1.com": remote error: tls: internal error
Get "https://example2.com": dial tcp: lookup example2.com
etc.

正确答案


您可以检查该错误是否与一些众所周知的错误类型兼容。我did it like this

func classifyNetworkError(err error) string {
    cause := err
    for {
        // Unwrap was added in Go 1.13.
        // See https://github.com/golang/go/issues/36781
        if unwrap, ok := cause.(interface{ Unwrap() error }); ok {
            cause = unwrap.Unwrap()
            continue
        }
        break
    }

    // DNSError.IsNotFound was added in Go 1.13.
    // See https://github.com/golang/go/issues/28635
    if cause, ok := cause.(*net.DNSError); ok && cause.Err == "no such host" {
        return "name not found"
    }

    if cause, ok := cause.(syscall.Errno); ok {
        if cause == 10061 || cause == syscall.ECONNREFUSED {
            return "connection refused"
        }
    }

    if cause, ok := cause.(net.Error); ok && cause.Timeout() {
        return "timeout"
    }

    return sprintf("unknown network error: %s", err)
}

今天关于《golang中网络错误的正确处理方法是什么?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>