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:错误的捕获抛出错误自定义错误的主要内容,如果未能解决你的问题,请参考以下文章