首页 > 其他分享 >Go Lang 异常处理

Go Lang 异常处理

时间:2024-01-14 23:59:38浏览次数:30  
标签:Lang defer err fmt Println func error Go 异常

C#,JAVA等语言通过try...catch...finally实现错误的捕获和处理 Go Lang异常处理的设计思想中主张

  • 如果一个函数可能出现异常,那么应该把异常作为返回值,没有异常就返回 nil
  • 每次调用可能出现异常的函数时,都应该主动进行检查,并做出反应,这种 if 卫述语句
所以异常应该总是掌握在我们的手上,保证每次操作产生的影响达到最小,保证程序即使部分地方出现问题,也不会影响整个程序的运行,及时的处理异常,这样就可以减轻上层处理异常的压力。同时也不要让未知的异常使你的程序崩溃。   Go Lang推荐的异常捕获常用到的一些内置函数大抵是: panic:主动抛出异常 recover: 捕获异常,只有在 defer 函数中使用 recover,才能捕获 panic 异常 defer:defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,将延迟的语句按defer的逆序进行执行,也就是说先被defer的语句最后被执行,最后被defer的语句,最先被执行,通常用于释放资源。 errors:定义异常信息 fmt.Errorf:定义异常信息 nil:nil 是一个预定义的标识符,在不同的上下文环境中有不同的含义,但通常表示“无”、“空”或“零值”。 nil 可以赋值给指针、切片、map、通道、函数以及接口类型的变量   模拟一下常用的try..catch
    defer func(){
        err:=recover()
        fmt.Println(err)
    }()

    panic("this is an error")
我自己的理解是,相当于先定义了catch的方法,后面抛出的异常都将被defer中的recover捕获,然后打印出来   那么如果是某一个被调用的函数中有异常又会发生什么?


func throwException(){
    panic("this is an error")
}

func main() {

    defer func(){
        err:=recover()
        fmt.Println(err)
    }()

    throwException()
    // panic("this is an error")

    }
throwException中的异常依旧会被捕获   上面的代码会有一个问题,就是不论有没有异常,fmt.Println(err)都会被执行,这时候需要引入nil关键字 就如它的定义,它代表着0值,这里err!=nil 说明的是err有被赋值也就是有被捕获到错误


func throwException(){
    // panic("this is an error")
    fmt.Println("there is no error")
}

func main() {

    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    throwException()
    // panic("this is an error")

    }
 


func throwException(){
    panic("this is an error")
    // fmt.Println("there is no error")
}

func main() {

    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    throwException()
    // panic("this is an error")

    }
可以对比上面两个代码的执行结果 这样try..catch的方式就被实现了 下面介绍的是推荐的写法,就是把error放在返回值中带出来,这样就可以直接获取异常,不用在外部再获取错误


func throwException() (res error) {
    
    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
            res=fmt.Errorf("throw exception");
        }
    }()

    panic("this is an error")
    return
    // fmt.Println("there is no error")
}

func main() {

    defer func(){
        err:=recover()
        if err!=nil{
            fmt.Println(err)
        }
    }()

    res := throwException()
    fmt.Println(res)
    // panic("this is an error")

    }
  以上就是Go Lang的异常处理

标签:Lang,defer,err,fmt,Println,func,error,Go,异常
From: https://www.cnblogs.com/terry841119/p/17964461

相关文章

  • go-micro 简介
    1.go-micro简介GoMicro是一个插件化的基础框架,基于此可以构建微服务,Micro的设计哲学是可插拔的插件化架构在架构之外,它默认实现了consul作为服务发现(2019年源码修改了默认使用mdns),通过http进行通信,通过protobuf和json进行编解码2.go-micro的主要功能服务发现:自动服务注......
  • Django 源码分析(一):命令分析
    Django源码分析(一):命令分析说明:本部分主要介绍Django程序在开发中常用的命令是如何控制生成的进行解析;1.分析入口启动命令:pythonmanage.pyrunserver127.0.0.1:8000项目启动的时候执行的manage.py脚本,相关代码如下:"""Django'scommand-lineutilityforadministrat......
  • Django 源码分析(二):wsgi & asgi
    Django源码分析(二):wsgi&asgi说明:上一节主要讲述了django项目的启动,后期主要会根据django请求的生命周期进行分析;参考文章:https://zhuanlan.zhihu.com/p/95942024参考文章:https://zhuanlan.zhihu.com/p/269456318附:生命周期参考图;第一步:浏览器发起请求补充:第一步和第......
  • Django 请求到来与路由匹配
    Django请求到来与路由匹配说明:本部分主要讲述请求到来与路由匹配的部分;1.请求到来上次分析到了wsgi的函数内部处理信息,我们已经知道请求到了之后会执行__call__方法,下面将继续分析__call__方法。classWSGIHandler(base.BaseHandler):#继承BaseHandlerrequest......
  • Django 源码(三)-应用 & 中间件 & 配置文件
    Django源码(三)-应用&中间件&配置文件本部分主要是在为程序启动时候加载应用以及中间件的信息;1.应用的加载在程序启动的部分,我们分析到程序执行的时候都会执行一个setup()函数,相关的内容可以看之前的章节的部分;defsetup(set_prefix=True):"""Configurethes......
  • 异常的基本语法
    最基本的语法#define_CRT_SECURE_NO_WARNINGS#include<iostream>intfunc(inta,intb){if(b==0){//2抛出异常throw12;//抛出一个int类型的异常}returna/b;}voidtest(){inta=10;intb=0;//1把......
  • The 2nd Universal Cup Stage 18: Dolgoprudny H
    题意大概是说求有所有有标号有根树及其黑白染色方案使得定义\(S_{x}\)为\(x\)和其儿子节点构成的集合,则\(S_{x}\)中的黑色节点个数要求不少于白色节点个数,且定义\(x\)的白色节点个数为\(cnt_{x}\),则其方案的贡献为\(\sum_{i=1}^{n}cnt_{i}!\)(原题意这里似乎说的非常抽......
  • 不会有人24年还在go吧!——mygo观后感
    第1~4话:“你愿意和我组一辈子乐队吗”——高松灯。这段剧情是主要剧情的铺垫,引出了主要的出场人物和其性格。CRYCHIC由于大祥老师的离开崩溃了,乐队的成员也都或多或少受了伤,本来他们已经再也不可能组乐队了,这段破碎的关系也不可能通过他们自己修复了。但是,外界出现了影响因素—......
  • windows下打包go项目放在linux上部署
    1.打开命令提示符或终端,并导航到包含main.go的目录。2.使用以下命令进行交叉编译:GOOS=linuxGOARCH=amd64gobuild-omyprogram 这将生成一个名为myprogram的可执行文件,该文件是为Linux上的AMD64架构编译的。5.现在,你可以将生成的myprogram文件复制到Linux系统上运行。......
  • prb2xml go
    之前浏览protobuf-c相关代码的时候,根据如下 protobuf_c_message_packprotobuf_c_message_pack_to_bufferprotobuf_c_message_unpackprotobuf_c_message_free_unpacked 函数的实现,写了一个protobuf2xml、xml2protobuf 以及protobuf2json、json2protobuf的公共代码。解决了......