正确处理golang中的context.deadlineExceededError

有没有办法在异常处理开关中按类型匹配 golang 上下文超时错误?


switch err.(type)

case context.deadlineExceededError:

  fmt.Println("deadline exceeded")

}

不会编译,由于


cannot refer to unexported name context.deadlineExceededError

AFAICS 由于类型未导出,因此只能通过字符串比较来处理。


package main


import (

        "context"

        "fmt"

        "time"

)


const shortDuration = 1 * time.Second


func main() {

        ctx, cancel := context.WithTimeout(context.Background(), shortDuration)

        defer cancel()


        select {

        case <-time.After(shortDuration*2):

                fmt.Println("overslept")

        case <-ctx.Done():

                err := ctx.Err()

                switch err.(type) {

                case context.deadlineExceededError:

                        fmt.Println("deadline")

                }

                fmt.Printf("error %T: %v\n", err, err)

        }


}

$ go build main.go

# command-line-arguments

./main.go:21:8: cannot refer to unexported name context.deadlineExceededError

vs 字符串比较


        case <-ctx.Done():

                err := ctx.Err()

                errType := fmt.Sprintf("%T",err)

                switch errType {

                case "context.deadlineExceededError":

                        fmt.Println("deadline")

                }

                fmt.Printf("error %T: %v\n", err, err)

        }

$ go build main.go && ./main

deadline

error context.deadlineExceededError: context deadline exceeded


FFIVE
浏览 891回答 1
1回答

红颜莎娜

您可以使用该context.DeadlineExceeded值(文档):无论是直接err == context.DeadlineExceeded比较,或使用errors.Is(err, context.DeadlineExceeded).
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go