go语言中的异常处理,没有try...catch等,而是使用defer、panic、recover来处理异常。

1、首先,panic 是用来表示非常严重的不可恢复的错误的。在Go语言中这是一个内置函数,如果在程序中遇到异常,或者调用panic函数,程序会立即退出(除非recover)。如下代码:

package main

import "fmt"

func main() {
a := 10
b := 0
c := a / b fmt.Println(c)
}

  程序的输出如下:

➜  demo06 go run main.go
panic: runtime error: integer divide by zero goroutine 1 [running]:
main.main()
/Users/qstudy/myfiles/project/src/go_dev/day11/demo06/main.go:8 +0x11
exit status 2

  在这个输出中,我们可以看到有个panic。

2、defer能保证在函数结束最后执行该方法(有问题的或者引发panic的函数),但是有个条件:必须在错误出错之前进行拦截,在错误出现后进行错误捕获,如果在定义的方法中defer定义的方法如果在panic后面,defer定义的方法就无法执行到。如下代码:

package main

import "fmt"

func test(i int) {
var arr [10]int
// 错误拦截必须配合defer使用,通过匿名函数使用,在错误之前引用
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
}() arr[i] = 123
fmt.Println(arr)
} func main() {
i := 10
test(i)
fmt.Println("hello world")
}

  执行后输出如下:

runtime error: index out of range
hello world

  从以上结果可以看出,如果panic被recover捕获接收到,panic后的方法还是能继续执行的。

来自一本书书上面的总结:

“当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中
之前使用defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致
逐层向上执行panic流程,直至所属的goroutine 中所有正在执行的函数被终止。错误信息将被报
告,包括在调用panic()函数时传入的参数,这个过程称为错误处理流程。”

go语言中使用defer、panic、recover处理异常的更多相关文章

  1. Go语言异常处理defer\panic\recover

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  2. go语言defer panic recover用法总结

    defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...

  3. Go语言中异常处理painc()和recover()的用法

    Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调 ...

  4. defer,panic,recover

    Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个 ...

  5. Go的异常处理 defer, panic, recover

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  6. defer, panic, recover使用总结

    1. defer : 延迟调用.多个defer,依次入栈,在函数即将退出时,依次出栈调用 package main import "fmt" func main() { defer ...

  7. Golang 入门系列(十四)defer, panic和recover用法

    以前讲过golang 的基本语法.但是,只是讲了一些基础的语法,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863 ...

  8. go panic recover 异常处理

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  9. 6.Go-错误,defer,panic和recover

    6.1.错误 Go语言中使用builtin包下error接口作为错误类型 Go语言中错误都作为方法/函数的返回值 自定义错误类型 //Learn_Go/main.go package main imp ...

随机推荐

  1. 解决android studio引用远程仓库下载慢(JCenter下载慢)

    使用开源中国的maven库 阿里云的(速度飞快):http://maven.aliyun.com/nexus/content/groups/public/ 替换项目根目录下build.gradle中的 ...

  2. stream流操作List工具类

    工作中操作List对于程序猿来说是"基本操作",为了更加便利,对JDK8的新特性stream流进行二次封装.话不多说,直接上代码 package com.mydemo; impor ...

  3. Mac打开Terminal报错-bash : : command not found

    问题描述: Mac系统在打开Terminal的时候,报错-bash : : command not found. 问题分析: 报错并不影响Terminal的使用,于是忽略不计.但是在修改.bash_p ...

  4. 继收购Magento十个月,Adobe推出Commerce Cloud商务云服务

    去年 5 月,软件巨头 Adobe 以 16.8 亿美元的价格,受过了 Magento .在经历了十个月的业务整合后,该公司终于推出了全新的 Commerce Cloud 商务云服务.据悉,其本质上是 ...

  5. Android Intent 传递数据注意事项

    不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction缓存为 1MB),可能导致 OOM.

  6. 解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真

    通常我们拿到某个ECU的通信矩阵数据库文件,.dbc后缀名的文件. 直接使用CANdb++ Editor打开,可以很直观的读懂信号矩阵的信息,例如下图: 现在要把上图呈现的信号从.dbc文件中解析出来 ...

  7. pwn-GUESS

    参考了其他wp之后才慢慢做出来的 记录一下 首先checksec一下 有canary 放到IDA看下源码 运行流程大概是 有三个fork 即三次输入机会,于是无法爆破cannary 本题用的是SSP ...

  8. MVN TEST指定运行脚本

    clean:表示将你上一次编译生成的一些文件删除 test:表示只执行测试代码 >mvn clean test -Dtest=[ClassName] 运行测试类中指定的方法:这个需要maven- ...

  9. GWAS: 阿尔兹海默症和代谢指标在大规模全基因组数据的遗传共享研究

    今天要讲的一篇是发表于 Hum Genet 的 "Shared genetic architecture between metabolic traits and Alzheimer's d ...

  10. POJ 3666 Making the Grade (动态规划)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...