golang panic和recover 捕获异常
func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数。
panic的作用就是抛出一条错误信息,从它的参数类型可以看到它可以抛出任意类型的错误信息。在函数执行过程中的某处调用了panic,则立即抛出一个错误信息,同时函数的正常执行流程终止,但是该函数中panic之前定义的defer语句将被依次执行。之后该goroutine立即停止执行。
recover()用于将panic的信息捕捉。recover必须定义在panic之前的defer语句中。在这种情况下,当panic被触发时,该goroutine不会简单的终止,而是会执行在它之前定义的defer语句。
下面是简单的例子:
捕捉自己设置的panic错误:
package mainimport "fmt"
import "math"func foo(a int) {defer fmt.Println("foo退出来了")defer func() {if r := recover(); r != nil {fmt.Printf("捕获到的错误:%s\n", r)}}()if a < 0 {panic("必须输入大于0的数")}fmt.Println("该数的方根为:", math.Sqrt(float64(a)))}func main() {var a inta = 10fmt.Printf("a=%d\n", a)foo(a)var b intb = -10fmt.Printf("b=%d\n", b)foo(b)fmt.Println("该goroutine还可以执行")
}
// ///
a=10
该数的方根为: 3.1622776601683795
foo退出来了
b=-10
捕获到的错误:必须输入大于0的数
foo退出来了
该goroutine还可以执行Process finished with exit code 0
捕捉go语言内部的Panic错误:
package mainimport "fmt"func foo() {defer func() {if r := recover(); r != nil {fmt.Printf("捕获到的错误:%s\n", r)}}()var a, b inta, b = 1, 1c := 3/(a-b)fmt.Println(a, b, c)}func main() {foo()
}//====
捕获到的错误:runtime error: integer divide by zero
利用golang自带包 runtime/debug 异常时打印
DebugInfo.go
package mainimport ("fmt""os""runtime/debug""time"
)func TryE() {errs := recover()if errs == nil {return}exeName := os.Args[0] //获取程序名称now := time.Now() //获取当前时间pid := os.Getpid() //获取进程IDtime_str := now.Format("20060102150405") //设定时间格式fname := fmt.Sprintf("%s-%d-%s-dump.log", exeName, pid, time_str) //保存错误信息文件名:程序名-进程ID-当前时间(年月日时分秒)fmt.Println("dump to file ", fname)f, err := os.Create(fname)if err != nil {return}defer f.Close()f.WriteString(fmt.Sprintf("%v\r\n", errs)) //输出panic信息f.WriteString("========\r\n")f.WriteString(string(debug.Stack())) //输出堆栈信息
}
测试异常捕获 main.go
package mainimport ("fmt""time"
)func main() {defer TryE()fmt.Println(time.Now())panic(-2)fmt.Println("panic restore now, continue.")
}
golang panic和recover 捕获异常相关推荐
- Golang中的panic和recover(捕获异常)
Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...
- golang panic和recover
panic和recover 文章目录 panic和recover panic panic之后又panic recover recover后同一函数又panic recover后恢复到哪里 recove ...
- Golang中panic与recover的实现原理
今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic.recover.defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看 ...
- recover 没有捕获异常_GO语言异常处理机制panic和recover分析
本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...
- golang中的panic和recover
golang中的panic需要recover捕获,不然程序就会挂掉 package mainimport "fmt"func main() {f1()fmt.Println(&qu ...
- Golang的Panic和Recover
什么是 panic? 在 Go 语言中,程序中一般是使用错误来处理异常情况.对于程序中出现的大部分异常情况,错误就已经够用了. 但在有些情况,当程序发生异常时,无法继续运行.在这种情况下,我们会使用 ...
- golang panic recover return defer的逻辑顺序问题
package mainimport "fmt"//验证golang return defer recover 之间的顺序关系func main() {defer func() { ...
- Golang 错误捕获 Panic 与 Recover
Golang 错误捕获 Panic 与 Recover,我抓住你了,Error Golang轻松学习 文章目录 Golang 错误捕获 Panic 与 Recover,我抓住你了,Error 一.Go ...
- Golang——error处理及panic、recover使用的正确姿势
异常就是程序出现了不正常的情况,会导致程序非正常停止,而异常处理就是针对非正常停止的情况,给出异常时的处理方式.语法错误不算异常体系中 error: error是一个接口,作用是返回程序异常的信息,e ...
最新文章
- System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
- Bootstrap 字体图标(Glyphicons)
- C++ windows 平台的 Hook
- GARFIELD@10-16-2004
- 04732微型计算机技术,04732微型计算机及其接口技术200710
- 对象实例化指针_new一个对象发生了什么
- 【Flink】FlinkPer-partition watermark 问题 某个 分区延迟 导致数据丢失
- python词组语义相似度_文本匹配,语义相似度,匹配相似短语/单词python语义wordNet模糊匹配...
- 在矩池云上复现 CVPR 2018 LearningToCompare_FSL 环境
- ByteBuffer分散和聚集的应用场景
- js 笔记 -- 随机生成颜色值
- Strategy模式C++实现
- 中国34个省级行政区2000年-2021年逐月1km植被指数NDVI栅格数据处理及下载
- 什么是智能合约安全审计
- jQuery+CSS3炫酷机械键盘js特效
- 电脑文件丢失了怎么恢复?2021最新教程汇总
- 移动WEB开发之响应式布局--Bootstrap栅格系统
- 解决su – 后显示-bash-4.1#
- WinCE EBOOT的入口Startup.s
- 如何在ubuntu中安装无线网卡驱动(迅捷FW150UH)