设为首页 加入收藏

TOP

[系列] Gin框架 - 自定义错误处理(一)
2019-07-25 14:17:27 】 浏览:120
Tags:系列 Gin 框架 定义 错误 处理

概述

很多读者在后台向我要 Gin 框架实战系列的 Demo 源码,在这里再说明一下,源码我都更新到 GitHub 上,地址:https://github.com/xinliangnote/Go

开始今天的文章,为什么要自定义错误处理?默认的错误处理方式是什么?

那好,咱们就先说下默认的错误处理。

默认的错误处理是 errors.New("错误信息"),这个信息通过 error 类型的返回值进行返回。

举个简单的例子:

func hello(name string) (str string, err error) {
    if name == "" {
        err = errors.New("name 不能为空")
        return
    }
    str = fmt.Sprintf("hello: %s", name)
    return
}

当调用这个方法时:

var name = ""
str, err :=  hello(name)
if err != nil {
    fmt.Println(err.Error())
    return
}

这就是默认的错误处理,下面还会用这个例子进行说。

这个默认的错误处理,只是得到了一个错误信息的字符串。

然而...

我还想得到发生错误时的 时间文件名方法名行号 等信息。

我还想得到错误时进行告警,比如 短信告警邮件告警微信告警 等。

我还想调用的时候,不那么复杂,就和默认错误处理类似,比如:

alarm.WeChat("错误信息")
return

这样,我们就得到了我们想要的信息(时间文件名方法名行号),并通过 微信 的方式进行告警通知我们。

同理,alarm.Email("错误信息")alarm.Sms("错误信息") 我们得到的信息是一样的,只是告警方式不同而已。

还要保证,我们业务逻辑中,获取错误的时候,只获取错误信息即可。

上面这些想出来的,就是今天要实现的,自定义错误处理,我们就实现之前,先说下 Go 的错误处理。

错误处理

package main

import (
    "errors"
    "fmt"
)

func hello(name string) (str string, err error) {
    if name == "" {
        err = errors.New("name 不能为空")
        return
    }
    str = fmt.Sprintf("hello: %s", name)
    return
}

func main() {
    var name = ""
    fmt.Println("param:", name)

    str, err := hello(name)
    if err != nil {
        fmt.Println(err.Error())
        return
    }

    fmt.Println(str)
}

输出:

param: Tom
hello: Tom

当 name = "" 时,输出:

param:
name 不能为空

建议每个函数都要有错误处理,error 应该为最后一个返回值。

咱们一起看下官方 errors.go

// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package errors implements functions to manipulate errors.
package errors

// New returns an error that formats as the given text.
func New(text string) error {
    return &errorString{text}
}

// errorString is a trivial implementation of error.
type errorString struct {
    s string
}

func (e *errorString) Error() string {
    return e.s
}

上面的代码,并不复杂,参照上面的,咱们进行写一个自定义错误处理。

自定义错误处理

咱们定义一个 alarm.go,用于处理告警。

废话不多说,直接看代码。

package alarm

import (
    "encoding/json"
    "fmt"
    "ginDemo/common/function"
    "path/filepath"
    "runtime"
    "strings"
)

type errorString struct {
    s string
}

type errorInfo struct {
    Time     string `json:"time"`
    Alarm    string `json:"alarm"`
    Message  string `json:"message"`
    Filename string `json:"filename"`
    Line     int    `json:"line"`
    Funcname string `json:"funcname"`
}

func (e *errorString) Error() string {
    return e.s
}

func New (text string) error {
    alarm("INFO", text)
    return &errorString{text}
}

// 发邮件
func Email (text string) error {
    alarm("EMAIL", text)
    return &errorString{text}
}

// 发短信
func Sms (text string) error {
    alarm("SMS", text)
    return &errorString{text}
}

// 发微信
func WeChat (text string) error {
    alarm("WX", text)
    return &errorString{text}
}

// 告警方法
func  alarm(level string, str string) {
    // 当前时间
    currentTime := function.GetTimeStr()

    // 定义 文件名、行号、方法名
    fileName, line, functionName := "?", 0 , "?"

    pc, fileName, line, ok := runtime.Caller(2)
    if ok {
        fun  
		
编程开发网
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[系列] Gin框架 - 数据绑定和验证 下一篇go 接口