>백엔드 개발 >Golang >다른 오류로 인해 래핑된 경우에도 Go에서 요청 취소 오류를 안정적으로 확인하려면 어떻게 해야 하나요?

다른 오류로 인해 래핑된 경우에도 Go에서 요청 취소 오류를 안정적으로 확인하려면 어떻게 해야 하나요?

DDD
DDD원래의
2024-11-08 04:08:01307검색

How do I reliably check for a request cancellation error in Go, even if it has been wrapped by another error?

Go에서 요청 취소 확인

Go에서는 요청이 취소되었는지 확인하는 것이 어려울 수 있습니다. 다음 코드를 고려해보세요.

package main

import (
    "context"
    "log"
    "net/http"
)

func main() {
    r, _ := http.NewRequest("GET", "http://example.com", nil)
    ctx, cancel := context.WithCancel(context.Background())
    r = r.WithContext(ctx)
    ch := make(chan bool)
    go func() {
        _, err := http.DefaultClient.Do(r)
        log.Println(err == context.Canceled)
        ch <- true
    }()
    cancel()
    <-ch
}

놀랍게도 이 코드는 요청이 취소되어야 함에도 불구하고 Go 1.9에서 false를 인쇄합니다.

올바른 접근 방식

최신 버전 취소를 확인하는 더 좋은 방법은 오류를 사용하는 것입니다. Go 1.13에 도입된 기능입니다. 업데이트된 코드 버전은 다음과 같습니다.

import (
    "context"
    "errors"
    "log"
    "net/http"
)

func main() {
    // Create a context that is already canceled
    ctx, cancel := context.WithCancel(context.Background())
    cancel()

    // Create the request with it
    r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

    // Do it, it will immediately fail because the context is canceled.
    _, err := http.DefaultClient.Do(r)
    log.Println(err) // Get http://example.com: context canceled

    // This prints false, because the http client wraps the context.Canceled
    // error into another one with extra information.
    log.Println(err == context.Canceled)

    // This prints true, because errors.Is checks all the errors in the wrap chain,
    // and returns true if any of them matches.
    log.Println(errors.Is(err, context.Canceled))
}

errors.Is를 사용하면 다른 오류로 인해 래핑된 경우에도 기본 오류가 컨텍스트 취소 오류인지 확실하게 확인할 수 있습니다. error.Is 함수는 전체 오류 체인을 순회하고 그 중 하나라도 주어진 오류 유형과 일치하면 true를 반환합니다.

위 내용은 다른 오류로 인해 래핑된 경우에도 Go에서 요청 취소 오류를 안정적으로 확인하려면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.