Recovery的错误捕获-《GO开发知识笔记》

admin 2025-11-04 01:09:31 编程 来源:ZONE.CI 全球网 0 阅读模式
    1. // recovery 机制,将协程中的函数异常进行捕获
    2. func Recovery() framework.ControllerHandler {
    3. // 使用函数回调
    4. return func(c *framework.Context) error {
    5. // 核心在增加这个 recover 机制,捕获 c.Next()出现的 panic
    6. defer func() {
    7. if err := recover(); err != nil {
    8. c.Json(500, err)
    9. }
    10. }()
    11. // 使用 next 执行具体的业务逻辑
    12. c.Next()
    13. return nil
    14. }
    15. }

    这个中间件的作用是捕获协程中的函数异常。我们使用 defer、recover 函数,捕获了 c.Next 中抛出的异常,并且在 HTTP 请求中返回 500 内部错误的状态码。乍看这段代码,是没有什么问题的。但是我们再仔细思考下是否有需要完善的细节?

    首先是异常类型,我们原先认为,所有异常都可以通过状态码,直接将异常状态返回给调用方,但是这里是有问题的。这里的异常,除了业务逻辑的异常,是不是也有可能是底层连接的异常?

    以底层连接中断异常为例,对于这种连接中断,我们是没有办法通过设置 HTTP 状态码来让浏览器感知的,并且一旦中断,后续的所有业务逻辑都没有什么作用了。同时,如果我们持续给已经中断的连接发送请求,会在底层持续显示网络连接错误(broken pipe)。

    1. return func(c *Context) {
    2. defer func() {
    3. if err := recover(); err != nil {
    4. // 判断是否是底层连接异常,如果是的话,则标记 brokenPipe
    5. var brokenPipe bool
    6. if ne, ok := err.(*net.OpError); ok {
    7. if se, ok := ne.Err.(*os.SyscallError); ok {
    8. if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {
    9. brokenPipe = true
    10. }
    11. }
    12. }
    13. ...
    14. if brokenPipe {
    15. // 如果有标记位,我们不能写任何的状态码
    16. c.Error(err.(error)) // nolint: errcheck
    17. c.Abort()
    18. } else {
    19. handle(c, err)
    20. }
    21. }
    22. }()
    23. c.Next()
    24. }

    这段代码先判断了底层抛出的异常是否是网络异常(net.OpError),如果是的话,再根据异常内容是否包含“broken pipe”或者“connection reset by peer”,来判断这个异常是否是连接中断的异常。如果是,就设置标记位,并且直接使用 c.Abort() 来中断后续的处理逻辑。

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  6