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:错误的捕获抛出错误自定义错误

抛出错误

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

js 捕获异常和抛出异常

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

开发之统一异常处理