当前位置: 首页 > 知识库问答 >
问题:

go - DeepSeek 说的就近处理错误和使用中间件集中处理错误配合使用的说法是否合理?

小牛24075
2025-07-01

看 gin 的文档的这部分的时候感觉其跟 go 的思想好像有点不合: https://gin-gonic.com/zh-cn/docs/examples/error-handling-midd... 。搜了一下找到了这篇文章: https://juejin.cn/post/7064770224515448840 。感觉更不对劲了。然后我就问了一下 DeepSeek,DeepSeek 说最好还是多用就近处理,使用工具函数减少重复代码。或者是使用类似上面第二个链接里的方法,到底像不像我不太确定。用中间件集中处理错误仅作为兜底的机制。这样:

gin.Use(func(c *gin.Context) {
    defer func() {
        if err := recover(); err != nil {
            c.JSON(500, gin.H{"error": "internal server error"})
        }
    }()
    c.Next()
})

共有1个答案

姬墨竹
2025-07-01

合理,中间件捕获的是panic,就近处理的是error(error在go里跟普通实例没啥区别,用户必须手动检测并处理)。

他俩配合使用没什么问题,一般项目内就近处理掉方法返回的error就行了,panic一般发生在底层(如果需要也可以手动触发),一个统一的处理点就行了,中间件那里兜底panic这种不知道哪里发生的错误,很合适,但是中间件要放在调用链的最上层,避免漏掉错误处理导致程序崩溃。

 类似资料:
  • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp

  • 本文向大家介绍说说你对vue的错误处理的了解?相关面试题,主要包含被问及说说你对vue的错误处理的了解?时的应答技巧和注意事项,需要的朋友参考一下 分为errorCaptured与errorHandler。 errorCaptured是组件内部钩子,可捕捉本组件与子孙组件抛出的错误,接收error、vm、info三个参数,return false后可以阻止错误继续向上抛出。 errorHandle

  • 在Go里面通常采用显式返回错误代码的方式来进行错误处理。这个和Java或者Ruby里面使用异常或者是C里面运行正常返回结果,发生错误返回错误代码的方式不同。Go的这种错误处理的方式使得我们能够很容易看出哪些函数可能返回错误,并且能够像调用那些没有错误返回的函数一样调用。 package main import "errors" import "fmt" // Go语言里面约定错误代码是函数的最后一

  • Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义: type error interface { Error() string } 我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息: func Sqrt(f float64) (flo

  • 但是,使用retrofit每个请求都有其错误处理回调: 我如何在一个地方处理所有错误?

  • 我有三种不同的系统。我使用Spring integration来同步所有这些系统中的数据。 系统2将调用服务方法来持久化数据,如果请求有效,则返回响应,否则抛出异常 我需要发送服务方法响应到系统1和系统3,只有当操作成功。调用服务方法后,根据服务方法响应,使用Transformer生成对系统3的请求。在transformer之后,我将请求放入mq队列。 更新的JMS出站代码 如果服务类失败,我需要

  • 问题内容: 根据对此答案的评论,有可能通过关机功能来捕获致命错误,而使用不能捕获该错误。 但是,我无法确定如何确定是由于致命错误还是由于脚本到达末尾而导致关机。 另外,调试回溯函数似乎在关闭函数中已失效,因此对于记录发生致命错误的堆栈跟踪而言,它毫无价值。 所以我的问题是:对致命错误(尤其是未定义的函数调用)做出反应的同时保持创建适当回溯能力的最佳方法是什么? 问题答案: 这对我有用: 但是,您可

  • 问题内容: 我有一个Express中间件,因为我想在其中使用中间件来清理我的代码。 问题在于,当它拒绝时,它不会进入我的错误中间件,但是如果我删除了关键字,并且在中间件中,它将删除。 所以我得到的不是输入我的错误处理中间件,而是如何让错误冒泡并表达处理它? 问题答案: 问题是当它拒绝时,它不会进入我的错误中间件,但是如果我删除了async关键字并扔进了中间件中,它就会去。 目前不支持诺言,将来的版