hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 后端开发 - 正文 看Cosplay古风插画小姐姐,合集图集打包下载:炫龙网 · 炫龙图库

关于golang中的错误处理机制的细致引见_后端开发

2019-12-08后端开发ki4网17°c
A+ A-

基本

毛病处置惩罚应该是工程的一部份,Golang中的error是一个interface范例,以下:

type error interface {
	Error() string
}

通常完成Error()要领的构造,都能够作为毛病处置惩罚。因而假如函数大概涌现毛病,那末能够在返回值的末了,返回一个毛病,比方:

func foo() error {
	// ... do something
	return errors.New("foo error")
}

直接返回毛病

直接返回毛病,类似于直接返回字符串范例的毛病,或许毛病码之类的。字符串范例的毛病,在基本部份提到了。毛病码相当于Linux、C编程中的毛病码,平常我们须要本身定义。举个例子:

package mypkg

type ErrCode int

const (
	ERR1 = 1
	ERR2 = 2
	ERR3 = 3
)

func sub(a, b int) (int, ErrCode) {
	if b < 0 {
		return 0, ERR1
	} else if a < b {
		return 0, Err2
	} else if a < 0 {
		return 0, Err3
	}
	return a - b
}

这类范例的毛病,编写简朴,然则有两个缺点:

1、外层假如想要运用毛病码,则须要引入这个包,轻易涌现轮回援用的状况。

2、假如包内部修正返回的毛病码范例,则外部运用到毛病码的处所,都要举行响应的修正,破坏了封闭性。

关于第一个缺点,能够运用一个第三方的包,特地寄存毛病码,这个体式格局值得商议。永久不要经由过程推断Error()要领返回的字符串的值,来举行对应的毛病处置惩罚!!!

返回自定义范例的毛病

该体式格局能够返回自定义的范例,并经由过程断言自定义范例,来举行有关的毛病处置惩罚;自定义范例能够照顾更多的信息,代码实例:

package main

import (
	"errors"
	"fmt"
	"runtime/debug"
)

type MyError struct {
	Inner      error                  // 内粗毛病
	Message    string                 // 自定义毛病信息
	StackTrace string                 // 客栈信息
	Misc       map[string]interface{} //别的的一些数据
}

func (myError MyError) Error() string {
	return myError.Message
}

func wrapError(err error, msg string, msgArgs ...interface{}) MyError {
	return MyError{
		Inner:      err,
		Message:    fmt.Sprintf(msg, msgArgs),
		StackTrace: string(debug.Stack()),
		Misc:       make(map[string]interface{}),
	}
}

func Handle(key int) error {
	if key < 0 {
		return wrapError(errors.New("key < 0"), "This is an error test")
	}
	return nil
}

func main() {
	if err := Handle(-1); err != nil {
		if e, ok := err.(MyError); ok {
			fmt.Printf("Inner: %v, Message: %v, StackTrace: %v\n",
				e.Inner, e.Message, e.StackTrace)  // 这里输出对应的数据
		}
	}
}

这类体式格局处置惩罚问题越发轻易,然则依然大概会有包轮回援用的问题。

隐蔽内部细节的毛病处置惩罚

上述两种体式格局,能够顺应一些场景,不过都没法处置惩罚大概存在轮回依靠的问题。为此,我们运用github.com/pkg/errors的包来处置惩罚问题,给出一个代码实例。

func New(message string) error

假如有一个现成的error,我们须要对他举行再次包装处置惩罚,这时候有三个函数能够挑选。

//只附加新的信息
func WithMessage(err error, message string) error
//只附加挪用客栈信息
func WithStack(err error) error
//同时附加客栈和信息
func Wrap(err error, message string) error

实在上面的包装,很类似于Java的非常包装,被包装的error,实在就是Cause,在前面的章节提到毛病的基础缘由,就是这个Cause。所以这个毛病处置惩罚库为我们供应了Cause函数让我们能够获得最基础的毛病缘由。

func Cause(err error) error {
	type causer interface {
		Cause() error
	}

	for err != nil {
		cause, ok := err.(causer)
		if !ok {
			break
		}
		err = cause.Cause()
	}
	return err
}

运用for轮回一向找到最基础(最底层)的谁人error。

相干文章教程引荐:golang教程

以上就是关于golang中的毛病处置惩罚机制的细致引见的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
关于golang中的错误处理机制的细致引见_后端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>