[シリーズ]行く-GIN-APIルーティングミドルウェア - キャッチ例外(4)

アウトライン

プロジェクトの下の最初の同期:

ルーティングミドルウェア - 例外をキャッチ: - 記事の共有、およびルーティングミドルウェアロギングは、この記事を共有します。例外は、「異常は、!管理者に連絡してください」、そして同時に、パニックアラームメッセージを送信することを示唆し、システムを発生した場合。

何が異常なのですか?

例外は、プログラムの実行が投げたときにパニックがスローされたとき、それは、ある、パニックにあるプログラムで任意の保護措置を追加していない場合は、コンソールは、パニックの詳細をプリントアウトし、その後終了行きます。

我々は2つのタイプに分けパニックことができます。

一つは、意図的に、例えば、スローされます

panic("自定义的 panic 信息")

出力:

2019/09/10 20:25:27 http: panic serving [::1]:61547: 自定义的 panic 信息
goroutine 8 [running]:
...

一つは不注意ずさんな書き込みプログラムで、その結果、スローされ、例えば、

var slice = [] int {1, 2, 3, 4, 5}

slice[6] = 6

出力:

2019/09/10 15:27:05 http: panic serving [::1]:61616: runtime error: index out of range
goroutine 6 [running]:
...

オンライン環境はパニック、コマンドライン出力を持っている場合、我々はそれがすべてのひどい考え、問題を見つけることができませんキャプチャすることはできませんので、質問は、どのように例外をキャッチしているので、想像してみ?

例外をキャッチするには?

プログラムがパニックを発生した場合、延期の内側(ディレイ機能)の呼び出しは、キャプチャを回復することができます。

直接コードで、言っても過言ではありません。

defer func() {
    if err := recover(); err != nil {
        fmt.Println(err)
    }
}()

「故意でないスローパニック」についての実行で、出力:

runtime error: index out of range

OK、エラー・キャプチャー、その後、私たちは大騒ぎをすることができます。

Zuosaの記事では、我々はすべて今では知っている必要があります。

  • 呼ばれるランタイム・スタックを取得します(debug.Stack())
  • の時に取得された要求データ
  • データを組み立て、電子メール

だから、それを郵送する方法行き、何のオープンソースパッケージではありませんか?

もちろんそこにある、上読んでください。

包装メールの方法

パッケージを使用します。gopkg.in/gomail.v2

直接コードに:

func SendMail(mailTo string, subject string, body string) error {
    
    if config.ErrorNotifyOpen != 1 {
        return nil
    }

    m := gomail.NewMessage()

    //设置发件人
    m.SetHeader("From", config.SystemEmailUser)

    //设置发送给多个用户
    mailArrTo := strings.Split(mailTo, ",")
    m.SetHeader("To", mailArrTo...)

    //设置邮件主题
    m.SetHeader("Subject", subject)

    //设置邮件正文
    m.SetBody("text/html", body)

    d := gomail.NewDialer(config.SystemEmailHost, config.SystemEmailPort, config.SystemEmailUser, config.SystemEmailPass)

    err := d.DialAndSend(m)
    if err != nil {
        fmt.Println(err)
    }
    return err
}

私はスイッチを追加したこの作品では、あなたがフリーで、オフにしたい開きたいです。

今すぐメールを送信した後、全体のメッセージテンプレートは完璧です。

カスタムメールテンプレート

図:

これは、あなたが録音したいのか、変更するカスタマイズすることができ、悪くはないが、テンプレートの警告メッセージです。

一つの中間パッケージ

最後に、パッケージを見てください。

直接コードに:

func SetUp() gin.HandlerFunc {

    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {

                DebugStack := ""
                for _, v := range strings.Split(string(debug.Stack()), "\n") {
                    DebugStack += v + "<br>"
                }

                subject := fmt.Sprintf("【重要错误】%s 项目出错了!", config.AppName)

                body := strings.ReplaceAll(MailTemplate, "{ErrorMsg}", fmt.Sprintf("%s", err))
                body  = strings.ReplaceAll(body, "{RequestTime}", util.GetCurrentDate())
                body  = strings.ReplaceAll(body, "{RequestURL}", c.Request.Method + "  " + c.Request.Host + c.Request.RequestURI)
                body  = strings.ReplaceAll(body, "{RequestUA}", c.Request.UserAgent())
                body  = strings.ReplaceAll(body, "{RequestIP}", c.ClientIP())
                body  = strings.ReplaceAll(body, "{DebugStack}", DebugStack)

                _ = util.SendMail(config.ErrorNotifyUser, subject, body)

                utilGin := util.Gin{Ctx: c}
                utilGin.Response(500, "系统异常,请联系管理员!", nil)
            }
        }()
        c.Next()
    }
}

パニック異常は、出力を発生した場合:

{
    "code": 500,
    "msg": "系统异常,请联系管理员!",
    "data": null
}

一方、パニックアラームは、電子メールを受信します。

簡単ショット、いくつかの情報のDebugStack削除。

これにより、オーバーです。

リマーク

  • メールの場所、それが非同期で送信調整することができます。
  • 記事は、コードの一部のみを掲載、関連するコードgithubのを参照してください。
  • ときにテストメール、メールボックスの情報を設定してください。

送信元アドレス

https://github.com/xinliangnote/go-gin-api

行く-GIN-APIシリーズ

おすすめ

転載: www.cnblogs.com/xinliangcoder/p/11505645.html
おすすめ