首页 > 其他分享 >go fiber: 抛出自定义异常

go fiber: 抛出自定义异常

时间:2024-11-15 11:18:16浏览次数:1  
标签:fiber 出自 err fmt error go err1 自定义

一,代码:

1,自定义错误类:

package config

import (
    "fmt"
)
//定义错误代码和错误信息
type MyError struct {
    Code    int
    Msg     string
}
//需要定义通用的Error()方法
func (e MyError) Error() string {
    return fmt.Sprintf("Code: %d,Msg: %s",e.Code, e.Msg)
}

2,代码中抛出异常

package business

import ("industry/config")

//得到多个用户,按分页返回
func GetUserList(page int ,pageSize int) (string,error) {

    err := config.MyError{Code: 100, Msg: "遇到错误抛出自定义异常1234"}
    panic(&err)

    return "1,2,3",nil
}

3, middleware中捕获异常,按类型进行处理

package middleware

import (
	"fmt"
	"runtime/debug"
    "time"
	"github.com/gofiber/fiber/v2"
    "industry/config"
)


func NewRecover(c *fiber.Ctx) (err error) { //nolint:nonamedreturns // Uses recover() to overwrite the error

		// Catch panics
		defer func() {

			if r := recover(); r != nil {
               //如果是自定义异常时,则不需写日志
               if err1, ok1 := r.(*config.MyError); ok1 {
                   fmt.Println("----------找到了自定义错误:")
                   fmt.Println(err1)
                   fmt.Println("错误代码:"+fmt.Sprintf("%d", err1.Code))
                   fmt.Println("错误信息:"+err1.Msg)
                   //接收到用户自定义错误,不再写到日志中
                   err = err1

               } else {

                timeStr:=time.Now().Format("2006-01-02 15:04:05")
                //得到时间,ip地址,请求的地址,参数,user-agent,
                fullURL := c.OriginalURL()
                clientIP := c.IP()
                method := c.Method() // 获取请求方法
                userAgent := c.Get("User-Agent")
                // 获取所有查询参数
                queryParams := fmt.Sprintf("%v",c.Queries())
                fmt.Println("Query Params:", queryParams)
                //写到错误日志中
        filename:="/data/logs/gologs/exception-" + time.Now().Format("2006-01-02") + ".log"
        content:="["+timeStr+"] "+r.(error).Error()+"\n"+clientIP+" "+method+" "+fullURL+" "+userAgent+"\n"+queryParams+"\n"+string(debug.Stack())+"\n"
        config.GlobalWriteFile(filename,content)

				var ok bool
				if err, ok = r.(error); !ok {
					// Set error that will call the global error handler
					err = fmt.Errorf("%v", r)
				}
              }
			}
		}()

		// Return err if exist, else move to next handler
		return c.Next()
}

4, 返回错误信息时也按类型判断后处理

routes.go

package routes

import (
	"github.com/gofiber/fiber/v2"
	"industry/controller"
    "industry/middleware"
    "industry/config"
    "fmt"
)



func SetupRoutes() *fiber.App {

    app := fiber.New(fiber.Config{
		ErrorHandler: func(c *fiber.Ctx, err error) error {
			// 发送自定义错误页面
            // 如果是自定义错误,不再统一按500返回
            if err1,ok1:=err.(*config.MyError);ok1 {
                fmt.Println(err1)
                fmt.Println("route:错误是自定义异常")
                return c.SendString("内部错误代码:"+fmt.Sprintf("%d", err1.Code)+",错误信息:"+err1.Msg)
            } else {
                fmt.Println("route:错误不是自定义异常")
                return c.SendString("内部错误:500,"+err.Error())
            }
		},
	})



    app.Use(middleware.NewRecover)

    app.Use(middleware.ApiSign)

	//用户模块
	userController := controller.NewUserController()
	user := app.Group("/user")
	user.Get("/info", userController.GetUser)
	user.Post("/", userController.CreateUser)
    user.Get("/list", userController.ListUser)

	//文章模块
	articleController := controller.NewArticleController()
	article := app.Group("/article")
	article.Get("/info", articleController.GetArticle)
	article.Post("/add", articleController.CreateArticle)
    article.Get("/list", articleController.ListArticle)

    return app
}

二,测试效果:

 

 

标签:fiber,出自,err,fmt,error,go,err1,自定义
From: https://www.cnblogs.com/architectforest/p/18547627

相关文章

  • Django框架表单基础
    本节主要介绍一下Django框架表单(Form)的基础知识。Django框架提供了一系列的工具和库来帮助设计人员构建表单,通过表单来接收网站用户的输入,然后处理以及响应这些用户的输入。6.1.1HTML表单Django框架表单是在HTML模板中设计完成的,其实类似于传统HTMLForm表单的应用。在传统HTML......
  • leetcode 数组专题 06-扫描线算法(Sweep Line Algorithm)
    扫描线专题leetcode数组专题06-扫描线算法(SweepLineAlgorithm)leetcode数组专题06-leetcode.218the-skyline-problem力扣.218天际线问题leetcode数组专题06-leetcode.252meetingroom力扣.252会议室leetcode数组专题06-leetcode.253meetingroomii力扣.253......
  • xshell上实现:MongoDB文档查询
    实验内容概述    本实验旨在了解MongoDB文档数据库的基本操作,包括创建集合、插入文档数据和执行文档查询操作。实验环境:Linux(Centos7)xshell7Mongodb实验目的理解MongoDB文档数据库的基本概念和特性。掌握在MongoDB中创建集合和插入文档数据的方法。学习使用Mongo......
  • shodan 和 Google 语法
    shodan和Google语法shodanshodan作用shodan是一个网络空间测绘引擎,也可以叫做网络空间搜索引擎。可以用来搜索网络设备,主要用于信息收集。工作原理厂商在全球范围内的服务器上部署了很多扫描器,通过24小时不停地扫描相关的设备IP地址。优点:方便缺点:实时性差、消耗......
  • MongoDB创建只读用户并授权指定集合的查询权限
    MongoDB创建只读用户并授权指定集合的查询权限创建测试数据usetestdbdb.test_t.insertOne({id:1,name:'zhangsan'});db.test_t.insertOne({id:2,name:'lisi'});db.test_t1.insertOne({id:1,name:'zhangsan'});db.test_t1.insertOne({id:2,name:'lisi'}......
  • 基于 Python Django 的二手房间可视化系统分析
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • Leangoo敏捷管理工具全年365助力企业应用敏捷管理,提升高效项目管理能力
    敏捷管理:让企业高效运营的“秘密武器”在这个充满变化和不确定性的时代,越来越多的企业开始关注敏捷管理方法,希望通过更快速的方式应对市场的变化。无论是大型企业还是中小型企业,敏捷方法已成为推动业务成功的重要力量。尤其对于中小企业而言,如何降低成本、提高效率、提......
  • 探索Google Earth Engine:利用MODIS数据和R语言进行2000-2021年遥感生态指数(RSEI)的时空
    前段时间,小编学习了在GEE上进行遥感生态指数(RSEI)的评估,非常头疼,但是实验了两周后,亲测有效,主要采用的是MODIS数据分析了2000-2021年中国内蒙古某地的RSEI时间序列分布状况,现在把学习的代码分享给大家。1GEE计算RSEI1.1研究区域导入与初步定义varsa=ee.FeatureCollection(......
  • Google Play上架被拒的原因以及解决方法合集
     GooglePlay商店是全球Android开发者发布应用的首选平台,但在这个平台上发布或更新应用时,开发者必须遵守严格的规定和政策。如果违反这些规定,应用可能会被拒绝上架或更新,甚至可能导致开发者账号被封禁。本文将总结GooglePlay上架或更新被拒的常见原因,并提供相应的解决方案。......
  • Google Ads账号被封原因与申诉方法
      GoogleAds是全球最大的在线广告平台之一,为广告主提供了广泛的广告服务。然而,即使在遵守规则的情况下,有时账户也可能因为各种原因遭遇封禁。了解这些原因和申诉方法对于维护广告账户的健康至关重要。一、GoogleAds封户原因:1、违反平台政策:1)规避系统:常见原因包括在账......