首页 > 其他分享 >GoLang:异常处理

GoLang:异常处理

时间:2023-08-22 14:25:10浏览次数:40  
标签:defer err 处理 异常 GoLang func res panic

学习自:Go教程137页

1、异常

程序运行时,发生了不被期望的事件,它阻止程序正常预期的运行

Go中两种处理异常的方式:

  • 程序异常时,将异常信息反馈给使用者
  • 程序异常时,终止运行立刻退出

2、打印异常信息

1)fmt包中的Errorf函数创建error类型,打印

var err error = fmt.Errorf("错误信息")
fmt.Println(err)

2)errors包中的New函数创建error类型,打印

var err error = errors.New("错误信息")
fmt.Println(err)

3、中断程序

Go中提供了一个panic函数,用于发生异常时终止程序的运行

func div(a,b int)(res int){
    if(b==0){
        panic("除数不能为0") //一旦传入的除数为0,程序就会终止
    }else{
        res=a/b
    }
    return
}

两种触发panic终止程序的方式:

  • 手动调用panic函数
  • 程序内部出现问题,自动触发panic函数

第二种情况很常见:数组越界、除0都会导致panic自动触发

var arr = [3]int{1,3,5}
arr[5]=666 //数组越界 自动触发panic

var res = 10/0//除数为0 自动触发panic

4、恢复程序(Java中的try...catch...)

Go中通过deferrecover来实现对panic异常的捕获,来让程序继续执行:

①在panic之前,定义一个延迟调用的匿名函数

func div(a,b int) (res int){
    //定义一个defer匿名函数,用于捕获panic异常
    //defer函数要在panic之前定义并调用(其实际执行时间在出错退出时)
    defer func(){
        if err:=recover;err!=nil{
                res=-1
                fmt.Println(err)
        }
    }()
    if(b==0){
        panic("除数不能为0")
    }else{    
            res=a/b
    }
    return
}

panic会沿着堆栈向外传播,因此也可以在外层捕获,但一定要保证defer在抛出panic之前调用

func div(a,b int) (res int){
    if(b==0){
        panic("除数不能为0")
    }else{    
            res=a/b
    }
    return
}

func main(){
    defer func(){
        if err:=recover();err!=nil{
            fmt.Println(err)
        }
    }()
    div(10,0) //发生panic的地方
}

②多个panic,只有第一个会被捕获

func test1(){
    defer func(){
        if err:=recover();err!=nil{
            fmt.Println(err)
        }
    }()
    panic("异常A")//一个panic就相当于return,其后的语句将不再执行
    panic("异常B")
}

③如果把异常写在了defer中,那么只有defer中的异常会被捕获

func test2(){
    defer func(){
        if err := recover();err!=nil{
            fmt.Println(err)//最后打印的是defer中的异常B
        }
    }()

    defer func(){
        panic("异常B")
    }()
    
    panic("异常A")
}

  

 

标签:defer,err,处理,异常,GoLang,func,res,panic
From: https://www.cnblogs.com/ShineLeBlog/p/17648132.html

相关文章

  • 异常
    1.分类1.1Error系统内部错误,不会抛出,不应该被捕获,无法恢复,应该被声明1.2Exception1.2.1RuntimeException运行时异常应该被捕获,可以恢复,应该被声明1.2.2CheckedException检查异常应该被捕获,可以恢复,必须声明2.异常处理2.1抛出异常throw用在函数内,后面跟着异常......
  • EasyCVR视频融合平台Linux环境下CGO调用C接口推流异常,H.265转H.264失败的原因是?
    EasyCVR视频融合云平台采用云边端一体化架构,可以将分散在仓储各处的前端监控设备(如IPC、NVR等)集中接入,并提供实时视频监控、视频录像、云存储、录像检索与回放、智能告警、云台控制、平台级联、服务器集群等视频能力服务。通过实时高清视频监控,仓储管理人员可以高效地监管人员和货......
  • c#json处理字符串
    usingNewtonsoft.Json;//定义一个JSON字符串stringjsonStr="{\"username\":\"test\",\"age\":18}";//将JSON字符串解析成对象dynamicobj=JsonConvert.DeserializeObject(jsonStr);//访问对象属性stringname=obj.username......
  • Golang - Slice 学习笔记
    Slice1、概述:Slice又称动态数组,依托数组实现,可以方便的进行扩容、传递等,实际使用中比数组更灵活。2、实现原理Slice依托数组实现,底层数组对用户屏蔽,在底层数组容量不足时可以实现自动重分配并生成新的Slice。接下来按照实际使用场景分别介绍其实现机制。2.1Slcie底层结构源......
  • GoLange:面向对象
    学习自:Go教程130页1、类定义方式:结构体+方法结构体:定义有哪些数据方法:定义结构体的方法例子:定义一个Person类//结构体定义人的属性typePersonstruct{namestringageint}//方法定义人的行为func(pPerson)Say(){fmt.Println("mynameis",p.n......
  • SpringBoot实现统一异常处理
    大家在使用SpringBoot开发项目的时候肯定都需要处理异常吧,没有处理异常那么异常信息直接显示给用户这是非常不雅观的,同时还可能造成用户误会,那么今天我们就来简单的写一下如何在SpringBoot项目中实现统一的异常处理。1.自定义异常类我们先定义一个自定义业务异常类,这个异常类继......
  • 爬虫异常处理:异常捕获与容错机制设计
    作为一名专业的爬虫程序员,每天使用爬虫IP面对各种异常情况是我们每天都会遇到的事情。在爬取数据的过程中,我们经常会遇到网络错误、页面结构变化、被反爬虫机制拦截等问题。在这篇文章中,我将和大家分享一些关于如何处理爬虫异常情况的经验和技巧。通过异常捕获和容错机制的设计,我们......
  • iOS学习之--字符串的删除替换(字符串的常用处理,删除,替换)
    字符串操作,比较简单,仅做记录!1、删除NSString*str1=@"<hello,word!>";//删除字符串两端的尖括号NSMutableString*mString=[NSMutableStringstringWithString:str1];//第一个参数是要删除的字符的索引,第二个是从此位开始要删除的位数[mStringdeleteCh......
  • springSecurity异常提示国际化
    1:获取国际化文件在一个jar包里,可以先下载jar包,然后再里面找到中文的那个文件<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>3.2.0.RELEASE</vers......
  • GoLang:接口
    学习自:Go教程119页1、说明接口是为了定义某些标准,接口本身不需要实现这些标准。2、定义接口中不能有任何数据字段,只能有函数声明type接口名称interface{函数声明} 接口中嵌入另一个接口但是嵌入的接口中方法不能重名,把自己嵌入自己3、例子1)常规用法定义一......