前言
在编程中,我们肯定会出现一些异常情况,比如除数为零,或者空指针等情况,业务异常我们可以通过逻辑判断来处理,但是一些比如说连接超时等错误,我们就只能手动处理了。
关键字与方法
处理异常肯定少不了使用go的关键字和接口方法等这里先介绍一下
// go自带的异常接口
type error interface {
Error() string
}
// 创建error一般会使用两种方式
err := errors.new("这里是异常信息")
err := fmt.Errorf("异常信息", "需要拼接的异常信息")
// defer 关键字与recover()方法
defer func(){
if err := recover();err != nil{
// 异常处理信息
}
}()
defer和recover是用来捕获和处理异常的,当然我们也可以使用逻辑判断,比如说if语句直接进行判断,来将一些异常情况直接拦截处理
注意点
- 在抛出panic时,程序会直接终止运行
- defer和recover必须在抛出异常之前,否则捕获不了异常
- defer和recover捕获异常后程序会继续执行(程序不会退出)
- 异常捕获会直接捕获第一个panic异常,后续就不会执行了
处理实战
定义一个除法
// 未进行异常处理
func div(dividend int,divisor int) int{
return dividend/divisor
}
// 方法内部进行异常处理
func divDefer(dividend int,divisor int) int {
defer func() {
if err := recover();err != nil{
fmt.Println("捕获异常", err)
}
}()
return dividend/divisor
}
进行方法调用
// 调用div方法
func main() {
// defer中的语句一定会执行
defer func() {
if err := recover(); err != nil {
fmt.Println("捕获到异常", err)
}
fmt.Printf("21234")
}()
//a := div(1, 1)
a := div(1, 0)
// 如果出现异常,这里不会执行
fmt.Printf(strconv.Itoa(a)+"/")
}
// 调用divDefer方法
func main() {
//a := div(1, 1)
a := div(1, 0)
// 如果出现异常,这里会执行
fmt.Printf(strconv.Itoa(a)+"/")
}
程序中我们一定会使用异常捕获,所以defer和recover一定会使用的,但是go语言的异常处理与java的try catch不一样,所以我们在使用的时候需要理解它的处理机制