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 捕获异常相关推荐

  1. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  2. golang panic和recover

    panic和recover 文章目录 panic和recover panic panic之后又panic recover recover后同一函数又panic recover后恢复到哪里 recove ...

  3. Golang中panic与recover的实现原理

    今天我们讲讲golang中panic异常,以及recover对异常的捕获,由于panic.recover.defer之间非常亲密,所以今天就放在一起讲解,这里会涉及到一些defer的知识,有兴趣可以看 ...

  4. recover 没有捕获异常_GO语言异常处理机制panic和recover分析

    本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...

  5. golang中的panic和recover

    golang中的panic需要recover捕获,不然程序就会挂掉 package mainimport "fmt"func main() {f1()fmt.Println(&qu ...

  6. Golang的Panic和Recover

    什么是 panic? 在 Go 语言中,程序中一般是使用错误来处理异常情况.对于程序中出现的大部分异常情况,错误就已经够用了. 但在有些情况,当程序发生异常时,无法继续运行.在这种情况下,我们会使用  ...

  7. golang panic recover return defer的逻辑顺序问题

    package mainimport "fmt"//验证golang return defer recover 之间的顺序关系func main() {defer func() { ...

  8. Golang 错误捕获 Panic 与 Recover

    Golang 错误捕获 Panic 与 Recover,我抓住你了,Error Golang轻松学习 文章目录 Golang 错误捕获 Panic 与 Recover,我抓住你了,Error 一.Go ...

  9. Golang——error处理及panic、recover使用的正确姿势

    异常就是程序出现了不正常的情况,会导致程序非正常停止,而异常处理就是针对非正常停止的情况,给出异常时的处理方式.语法错误不算异常体系中 error: error是一个接口,作用是返回程序异常的信息,e ...

最新文章

  1. System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
  2. Bootstrap 字体图标(Glyphicons)
  3. C++ windows 平台的 Hook
  4. GARFIELD@10-16-2004
  5. 04732微型计算机技术,04732微型计算机及其接口技术200710
  6. 对象实例化指针_new一个对象发生了什么
  7. 【Flink】FlinkPer-partition watermark 问题 某个 分区延迟 导致数据丢失
  8. python词组语义相似度_文本匹配,语义相似度,匹配相似短语/单词python语义wordNet模糊匹配...
  9. 在矩池云上复现 CVPR 2018 LearningToCompare_FSL 环境
  10. ByteBuffer分散和聚集的应用场景
  11. js 笔记 -- 随机生成颜色值
  12. Strategy模式C++实现
  13. 中国34个省级行政区2000年-2021年逐月1km植被指数NDVI栅格数据处理及下载
  14. 什么是智能合约安全审计
  15. jQuery+CSS3炫酷机械键盘js特效
  16. 电脑文件丢失了怎么恢复?2021最新教程汇总
  17. 移动WEB开发之响应式布局--Bootstrap栅格系统
  18. 解决su – 后显示-bash-4.1#
  19. WinCE EBOOT的入口Startup.s
  20. 如何在ubuntu中安装无线网卡驱动(迅捷FW150UH)

热门文章

  1. OpenUPF 的设备形态与架构设计
  2. Apache ServiceComb — Overview
  3. 架构师之路 — 分布式系统 — gRPC 谷歌远程过程调用
  4. DPDK — 数据平面开发技术
  5. Cinder LVM backend cinder-volume service down
  6. NanoPi NEO Air使用十六:使用python做开发
  7. java B2B2C Springcloud多租户电子商城系统-docker-feign-hystrix-ribbon(七)
  8. Linux的ELF格式分析
  9. 泛型委托 Predicate/Func/Action
  10. 温度传感器有源电子标签设计浅析