Loading

Golang 异常处理

golang基础教程
编写的程序难免有异常,异常分为:

  1. 编译时异常:在编译时抛出的异常,编译不通过,语法使用错误,符号填写错误等等。。。
  2. 运行时异常:在程序运行时抛出的异常,这个才是我们将要说的,程序运行时,有很多状况发生,例如:让用户输入一个数字,可用户偏偏输入一个字符串,导致的异常,数组的下标越界,空指针等等。。。。

简单的异常案例

一个简单的运行时异常场景…

package main

import "fmt"

func test(a int,b int) int{
	a = b / a
	return a
}
func main() {
	i := test(0, 1)
	fmt.Println("====main方法正常结束!!====",i)
}

结果:

panic: runtime error: integer divide by zero
goroutine 1 [running]:

出错代码:
a = b / a
解决方法:
1、添加判断
这种事比较常见的作法,将每种异常都考虑到,然后做出响应的处理

package main

import (
	"errors"
	"fmt"
)

func test(a int,b int) (int,error){
	var err error
	if a == 0{
		return 0,errors.New("a 不可以为0!!")
	}
	a = b / a
	return a,err
}

func main() {
	i,err := test(0, 1)
	if err ==nil{
		fmt.Println("====main方法正常结束!!====",i)
	}else{
		fmt.Println(err)
	}
}

当a=0返回值中的err不为nil

2、捕捉异常
异常的场景会有很多,会很难统计出来,或统计出来后出来很麻烦;此时我们就要对异常进行捕捉
这里将用到defer和recover
defer:延时执行,即在方法执行结束(出现异常而结束或正常结束)时执行
recover:恢复的意思,如果是异常结束程序不会中断,返回异常信息,可以根据异常来做出相应的处理
recover必须放在defer的函数中才能生效

package main

import (
	"fmt"
)
func test(a int, b int) int {
	defer func() {
		err := recover()
		fmt.Println("err:",err)
	}()
	a = b / a
	return a
}
func main() {
	i := test(0, 1)
	fmt.Println("====main方法正常结束!!====",i)
}

结果:

err: runtime error: integer divide by zero
====main方法正常结束!!==== 0

这里可以看到程序正常结束,并且也捕捉到了异常信息,在recover那可以处理异常

3、手动抛出异常
看到异常总觉得很讨厌,但有的时候它能帮助我们解决很多麻烦事,比如用户输入错误,就应该抛出异常,可以让这个异常一层层的返回给调用方的程序,使其不能继续执行,从而起到保护后面业务的目的,也简化了错误信息的传递,例如:

一个人取钱,账户只有100元,他输入了200元,从输入到账户扣款经过了20个方法调用,那总不能将这个err传递这么次,传到起始的调用处把?,后面的扣款业务也不能执行的

所以这里用抛出异常比较合适(当然这只是一个例子)

这里会用到panic:恐慌,惊慌,抛出异常终止程序执行的

package main

import (
	"errors"
	"fmt"
)

func test(a int) int {
	i:=100 - a
	if i<0{
		panic(errors.New("账户金额不足!!!!"))
	}
	fmt.Println("=======账户扣款=====")
	return i
}

func main() {
	i := test(101)
	fmt.Println("====main方法正常结束!!====余额:",i)
}

结果:

panic: 账户金额不足!!!!

goroutine 1 [running]:
posted @ 2023-07-04 18:28  猫鱼故巷  阅读(57)  评论(0编辑  收藏  举报