golang自定義一個簡潔而強大的錯誤追蹤包

一. 前言

1.1 錯誤追蹤須要瞭解的信息

  • 錯誤提示語
  • 錯誤的位置, 如:具體的文件名,錯誤行號和錯誤方法等.

1.2 實際狀況

  • golang自帶了錯誤信息包error
    只提供了簡單的用法, 如errors.New(),和errors.Error()用來傳遞和獲取錯誤信息.
  • 明顯官方的包已經不能知足了, 只能採起其餘方法補救, 如:git

    • 擴充官方包
    • 自定義錯誤包
  • 目前已經有不少人造了這個輪子, 同時也各有特點, 有簡單的, 也有複雜的.
  • 這裏爲了簡單使用, 我便選擇了擴充官方包, 作一個簡單優雅的錯誤處理包.

1.3 實現目標

經過簡單調用, 便可以查看咱們須要的信息, 最好是一鍵調用搞定.
爲了照顧使用習慣, 咱們就採用跟官方一致的用法, 來完成.
該包已經完成, github地址爲 https://github.com/gohouse/egithub

二. 實戰

2.1 先看下簡單用法

  • 生成一個錯誤
err := e.New("這裏有錯誤")
跟官方的方法名保持一致, 只不過放在了本身的 package e包下邊
  • 查看錯誤信息
err.Error()
這個跟官方保持一致, 返回的也僅僅是string
  • 查看堆棧信息
err.Stack()

這裏的stack是一個結構體, 包含了錯誤的文件名,行號和具體方法名golang

type ErrorStack struct {
    File     string
    Line     int
    FuncName string
}

所以, 咱們要拿到對應的信息, 就只須要簡單調用便可bash

// 獲取堆棧對象
errorStack := err.Stack()

// 獲取錯誤的文件
errorStack.File

// 獲取錯誤的文件行號
errorStack.Line

// 獲取錯誤的方法名
errorStack.FuncName

2.2 返回官方的標準error

err.ToError()

這裏則把錯誤信息交還給官方標準error, 只包含標準的錯誤信息學習

若是想攜帶stack信息, 則能夠使用code

err.ToErrorWithStack()

返回格式爲orm

error.New("標準錯誤信息; 錯誤文件:錯誤行號:錯誤方法名")

三. 完整示例

package main

import (
    "fmt"
    "github.com/gohouse/e"
)

func main() {
    var err e.E
    // 或者 var err e.Error
    err = testError()

    fmt.Println("錯誤信息:", err.Error())
    fmt.Println("錯誤堆棧信息:", err.Stack())
    fmt.Println("錯誤的文件名爲:", err.Stack().File)
    fmt.Println("錯誤行號:", err.Stack().Line)
    fmt.Println("錯誤方法名:", err.Stack().FuncName)

    fmt.Printf("%#v", err)
}

func testError() e.Error {
    return e.New("only show a custom errors demo")
}

輸出結果對象

錯誤信息: only show a custom errors demo
錯誤堆棧信息: {23 main.testError /go/src/github.com/gohouse/demo/e.go}
錯誤的文件名爲: /go/src/github.com/gohouse/demo/e.go
錯誤行號: 23
錯誤方法名: main.testError

e.Error{Msg:"only show a custom errors demo", Stack:e.Stack{Line:23, FuncName:"main.main", File:"/go/src/github.com/demo/e.go"}}

四. 更多用法

請查看官方倉庫, 地址爲: https://github.com/gohouse/e
或者加入QQ羣: 470809220
<img border="0" src="
http://pub.idqqimg.com/wpa/im...; alt="gorose-orm" title="gorose-orm">
交流學習get

相關文章
相關標籤/搜索