Golang 异常处理
golang基础教程
编写的程序难免有异常,异常分为:
- 编译时异常:在编译时抛出的异常,编译不通过,语法使用错误,符号填写错误等等。。。
- 运行时异常:在程序运行时抛出的异常,这个才是我们将要说的,程序运行时,有很多状况发生,例如:让用户输入一个数字,可用户偏偏输入一个字符串,导致的异常,数组的下标越界,空指针等等。。。。
简单的异常案例
一个简单的运行时异常场景…
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]: