Go 项目实战:全局异常处理

简介: 在 Go 项目中,异常处理是保障程序稳定性的关键。本文介绍 Go 的错误处理机制与 panic 恢复方法,并探讨如何实现全局异常处理中间件,以统一捕获和处理运行时错误,提升代码可维护性与健壮性。

在 Go 项目开发中,有效的异常处理是确保程序健壮性和稳定性的关键因素之一。全局异常处理机制能够统一处理项目中可能出现的各种异常情况,提高代码的可读性、可维护性以及错误处理的一致性。

一、Go 中的错误处理机制

在 Go 语言中,并没有像其他语言那样的传统异常机制。而是期望开发者主动去识别处理这种“异常”,通过返回值来表示可能出现的错误。

通常情况下,函数会返回一个结果集和一个错误值,我们需要判断错误值是否为 nil,如果不为 nil 则表示出现了“异常”。

go

体验AI代码助手

代码解读

复制代码

package main

import (
    "fmt"
)

// 模拟一个会返回错误的函数
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("除数不能为 0")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("出错啦:", err)
        return
    }
    fmt.Println("结果是:", result)
}

二、Go 中的 panic

当程序遇到无法处理的错误时,就会被提示panic,程序会直接崩溃。

recover 函数用于捕获 panic 抛出的信息,让程序从 panic 状态恢复继续正常执行,前提 recover 只能在 defer 函数中使用。

go

体验AI代码助手

代码解读

复制代码

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("已捕获到恐慌:", r)
        }
    }()

    // 手动触发一个 panic
    panic("这是一个恐慌!")
}

// 输出:
// 已捕获到恐慌:这是一个恐慌!

三、实现全局异常处理

根据上述其实不难发现,错误处理是显式的,我们可以做前置判断,根据具体情况进行处理,但是panic 处理通常是隐式的,一旦被调用 panic 函数,程序的执行流程会被打乱,需捕获 panic 才能恢复程序的正常执行。

所以针对这种隐式的、在编程过程中无法提前预知的错误,就很有必要做一层异常的处理,最好可以是全局处理。

为了实现全局异常处理,我们可以创建一个中间件或者全局的异常处理函数。

go

体验AI代码助手

代码解读

复制代码

func GlobalErrorHandler() gin.HandlerFunc {
    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err!= nil {
                log.Printf("Recovered from panic: %v", err)
                c.JSON(500, gin.H{
                    "message": "Internal Server Error",
                })
                c.Abort()
            }
        }()
        c.Next()
    }
}

四、在项目中的应用

在实际的项目中,我们可以将这个全局异常处理中间件应用到 HTTP 服务器的路由处理中。

go

体验AI代码助手

代码解读

复制代码

package main

import (
    "github.com/gin-gonic/gin"
    "log"
)

func main() {
    r := gin.Default()
    // 应用全局异常处理中间件
    r.Use(GlobalErrorHandler())

    r.GET("/ping", func(c *gin.Context) {
        // 模拟异常
        panic("Something went wrong!")
    })

    r.Run(":8080")
}

这样下来,在程序的后续处理中,一旦遇到 panic 就会被捕获,从而不影响程序的继续运行。


转载来源:https://juejin.cn/post/7482582425320620083

相关文章
|
存储 编译器 BI
掌握Go语言:Go语言基础构建模块解析,优缺点及进销存项目实战(2)
掌握Go语言:Go语言基础构建模块解析,优缺点及进销存项目实战(2)
169 0
|
2月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
存储 JSON 前端开发
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-JWT和中间件(Middleware)的使用EP07
前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Token,并且通过Iris的中间件(Middleware)进行鉴权操作。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-JWT和中间件(Middleware)的使用EP07
|
存储 JSON 前端开发
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-完善用户管理EP04
书接上回,上一回我们完成了用户管理页面的构建,并且通过前端的Vue.js框架动态地获取表单数据,同时异步请求后端Iris接口进行入库操作,过程中使用函数封装可复用的逻辑。 本回我们将继续完善用户管理功能。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-完善用户管理EP04
|
存储 JSON 缓存
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-模板与数据库EP02
书接上回,上次我们搭建好了项目入口文件,同时配置了路由体系,接着就可以配置项目的模板了,这里我们采用Iris内置的模板引擎,事实上,采用模板引擎并不意味着前后端耦合,模板中的数据保持其独立性即可,也就是说模板的数据操作交互方式采用http接口请求的形式,Iris并不参与模板逻辑,只返回Json格式的数据即可。前端集成数据双向绑定机制的框架Vue.js。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-模板与数据库EP02
|
存储 人工智能 前端开发
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-登录与图形验证码(captcha)EP06
书接上回,上一回我们按照“低耦合高内聚”的组织架构方针对项目的整体结构进行了优化,本回将会继续编写业务,那就是用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,校验通过后留存当前登录用户的信息,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-登录与图形验证码(captcha)EP06
|
前端开发 关系型数据库 MySQL
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目结构优化EP05
前文再续,上一回我们完成了用户管理模块的CURD(增删改查)功能,功能层面,无甚大观,但有一个结构性的缺陷显而易见,那就是项目结构过度耦合,项目的耦合性(Coupling),也叫耦合度,进而言之,模块之间的关系,是对项目结构中各模块间相互联系紧密程度的一种量化。耦合的强弱取决于模块间调用的复杂性、调用模块之间的方式以及通过函数或者方法传送数据对象的多少。模块间的耦合度是指模块之间的依赖关系,包括包含关系、控制关系、调用关系、数据传递关系以及依赖关系。项目模块的相互依赖越多,其耦合性越强,同时表明其独立性越差,愈加难以维护。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目结构优化EP05
|
JSON 前端开发 Go
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-用户系统EP03
前文再续,之前一篇我们已经配置好了数据库以及模板引擎,现在可以在逻辑层编写具体业务代码了,博客平台和大多数在线平台一样,都是基于用户账号体系来进行操作,所以我们需要针对用户表完成用户账号的CURD操作。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-用户系统EP03
|
JSON 监控 Go
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01
书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发。现在我们来看看Iris的基础功能,如何编写项目入口文件以及配置路由系统。
彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01
|
JSON 监控 前端开发
急如闪电快如风,彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-初始化项目EP00
在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris。彩虹女神的名号响彻寰宇、名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Iris回眸一笑撩人心扉:“虽然你们也不是那么慢,但我还是快那么一点点......”,本次就让我们来一睹彩虹女神Iris的芳颜,感受宇宙最快Web框架的神乎其神。
急如闪电快如风,彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-初始化项目EP00
下一篇
oss云网关配置