Golang:错误的捕获抛出错误自定义错误

Posted 保暖大裤衩LeoLee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang:错误的捕获抛出错误自定义错误相关的知识,希望对你有一定的参考价值。

概述

Golang中,程序的执行异常被称作为error,Java中称为exception。相应的,Golang中也会出现运行时error,也会需要捕捉错误、处理错误,乃至自定义错误满足开发的需求。

运行时错误

运行时错误,就是代码运行时无法预见的错误,类似于Java的RuntimeException及其子异常。

简单的除以0的demo:

//产生运行时异常
n1 := 1
n2 := 0
fmt.Printf("result=%d\\n", n1/n2)

捕捉错误

使用defer+recover来捕捉和处理

package main

import "fmt"

func test() {
	//使用defer + recover来捕获和处理异常
	defer func() {
		err := recover() //内建函数,捕获异常
		if err != nil {
			fmt.Printf("err=%v\\n", err)
		}
	}()
	//产生运行时异常
	n1 := 1
	n2 := 0
	fmt.Printf("result=%d\\n", n1/n2)
}

//异常处理
func main() {
	test()
	fmt.Println("main函数执行结束")
}

//执行结果:
err=runtime error: integer divide by zero
main函数执行结束

抛出错误并处理

package main

import (
	"errors"
	"fmt"
)

func checkBoolean(b bool) error {
	if b {
		fmt.Println("checkBoolean执行成功,没有异常")
		return nil
	}
	//返回自定义异常
	return errors.New("checkBoolean执行失败...")
}

func test() {
	err := checkBoolean(false) //输入false产生异常
	if err != nil {
		fmt.Println("checkBoolean执行异常")
		panic(err) //捕获异常,终止执行
	}
	fmt.Println("panic会退出程序的执行,所以当前Print并不会输出")
}


func main() {
	test()
}

错误的定义

Golang中提供的异常定义分为三种:

errors.New

err := errors.New("this is an error")

fmt.Errorf()

err := fmt.Errorf("this is an error")

自定义异常

package main

import (
	"fmt"
	"time"
)

// MyError 自定义异常结构体
type MyError struct {
	option    string //异常操作
	errorTime string //异常时间
	msg       string //异常信息
}

func createErrorStruct(option string, msg string) *MyError {
	myErr := new(MyError)
	myErr.option = option
	myErr.msg = msg
	now := time.Now()
	myErr.errorTime = now.Format("2006-01-02 15:04:05")
	return myErr
}

func (myError *MyError) Error() string {
	errInfo := fmt.Sprintf("option:%s,msg:%s,time:%s\\n", myError.option, myError.msg, myError.errorTime)
	return errInfo
}

// CheckAdult 检查年龄是否成年
func CheckAdult(age int) (bool, error) {
	if age >= 18 {
		fmt.Printf("年龄:%d,已经成年\\n", age)
		return true, nil
	} else if age > 0 && age < 18 {
		fmt.Printf("年龄:%d,未成年\\n", age)
		return false, nil
	} else if age == 0 {
		fmt.Println("输入的年龄为0,不合法")
		err := createErrorStruct("check age", "输入的年龄为0,不合法")
		return false, err
	} else {
		panic(createErrorStruct("check age", "输入的年龄小于0,不合法"))
	}
}

func test2(age int) {
	res, err := CheckAdult(age)
	if err == nil {
		fmt.Printf("年龄%d是否成年:%t\\n", age, res)
	} else {
		fmt.Printf("err[%v]\\n", err)
	}
}

func main() {
	test2(-1) //参数大于0:执行正常;参数等于0:返回错误;参数小于0:panic终止执行
}

以上是关于Golang:错误的捕获抛出错误自定义错误的主要内容,如果未能解决你的问题,请参考以下文章

Golang:错误的捕获抛出错误自定义错误

抛出错误

js 捕获异常和抛出异常

开发之统一异常处理

java学习中,异常和错误的简介捕获异常抛出异常自定义异常(java 学习中的小记录)

抛出异常时,Spring Boot 不显示自定义错误