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终止执行
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页
评论

打赏作者

保暖大裤衩LeoLee

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值