Go语言 如何返回延迟错误[重复]

ruoxqz4g  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(113)

此问题已在此处有答案

Handling errors in defer(2个答案)
两年前关门了。
查看以下函数

// JsonGet makes an HTTP Get call
func JsonGet(url string) ([]byte, int, error) {
    timeout := time.Duration(timeoutInSecs * time.Second)
    client := http.Client{
        Timeout: timeout,
    }

    request, err := http.NewRequest("GET", url, nil)
    request.Header.Set("Content-type", "application/json")

    if err != nil {
        return nil, 0, err
    }

    resp, err := client.Do(request)
    if err != nil {
        return nil, 0, err
    }
    // At this point we know we are successful so we can defer the close
    // https://blog.learngoprogramming.com/5-gotchas-of-defer-in-go-golang-part-iii-36a1ab3d6ef1
    defer func(f io.Closer) {
        if err := f.Close(); err != nil {
            log.Println("Error Deferring resp.Body.Close (io.Closer)")
        }
    }(resp.Body)

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, 0, err
    }

    return body, resp.StatusCode, nil


}

我对延迟函数有疑问
1.有没有一种方法,而不是记录错误,实际上返回错误作为函数返回的一部分?
1.您将如何更改此函数以适应此情况?
1.对于延迟时发生的错误,应采取的适当状态或操作是什么?换句话说,假设原始函数成功是因为它处理了一个请求。如果成功,返回后是否关闭。换句话说,是否存在这样的情况,即该函数可能返回结果,然后尝试执行defer和错误,但已经返回?

zbdgwd5y

zbdgwd5y1#

有没有一种方法,而不是记录错误,实际上返回错误作为函数返回的一部分?
是的,你可以让延迟函数修改返回值的内容,如果定义的函数接受一个命名的返回值(规则:https://blog.golang.org/defer-panic-and-recover)。在本例中,如果修改函数签名以返回error作为命名值,则可以更改defer中的error参数值
您将如何更改此函数以适应此情况?
你可以从博客页面上找到这个例子。在如下命名返回参数的情况下,deferred函数修改i的值。

func c() (i int) {
    defer func() { i++ }()
    return 1
}

并将其与下面的非命名参数返回的情况进行比较,在这种情况下,延迟函数中的操作不会反映r的值

func c() (int) {
    r := 1
    defer func() { r++ }()
    return r
}

如果成功,返回后是否关闭。
如果您的函数能够成功处理响应,则延迟函数将在两种情况下执行。在语句return body, resp.StatusCode, nil之后或读取return nil, 0, err失败时
是否存在这样的情况,即此函数可能返回结果,然后尝试执行延迟和错误,但已经返回?
不确定你在这里引用的用例是什么,但是延迟函数是当周围函数返回时的最后一个执行点。所以当你有一个延迟函数时,不可能有已经返回的情况。延迟函数调用中的错误是正常的,例如。在你的代码中,在关闭读取器时可能会有一个错误,在这种情况下,你所能做的就是修改命名的返回参数来指示错误的性质。

相关问题