1)说明

go的异常捕获需要延迟函数defer + recover实现,在函数返回前,就可以捕获到, 这样其实比java的try catch更加优雅一点;

比如: web服务器程序崩溃前,需要做一些清理,那么就可以这样搞定;

还可以在捕获时,打印一些信息,继续panic,让错误往上抛

2)案例

package main

import (

"fmt"

"runtime"

)

type panicContext struct {

function string

}

func ProtectRun(entry func()) {

defer func() {

err := recover()

switch err.(type) {

case runtime.Error:

fmt.Println("runtime error:", err)

default:

fmt.Println("error:", err)

}

}()

entry()

}

func g() {

defer func() {

err := recover()

switch err.(type) {

case runtime.Error:

fmt.Println("g() runtime error:", err)

default:

fmt.Println("g() error:", err)

}

}()

var b *int

/*

注意: 这行改为*b = 1/0 这样, 被除数是0,直接编译报错

$ go build main.go

# command-line-arguments

.\main.go:38:8: division by zero

*/

*b = 1

}

func main() {

fmt.Println("运行前")

ProtectRun(func() {

fmt.Println("手动宕机前")

panic(&panicContext{"手动触发panic"})

fmt.Println("手动宕机后")

})

ProtectRun(func() {

fmt.Println("赋值宕机前")

var a *int

*a = 1

fmt.Println("赋值宕机后")

})

g()

fmt.Println("运行后")

}

/*

$ ./main.exe

运行前

手动宕机前

error: &{手动触发panic}

赋值宕机前

runtime error: runtime error: invalid memory address or nil pointer dereference

g() runtime error: runtime error: invalid memory address or nil pointer dereference

运行后

*/

来源:oschina

链接:https://my.oschina.net/u/4368807/blog/4327637

recover 没有捕获异常_defer + recover 捕获所有异常相关推荐

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

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

  2. Python程序异常处理:try、except、else、finally,捕获指定异常类型、捕获多个异常类型、捕获所有异常类型、捕获异常信息、异常的传递、raise抛出自定义异常

    输入与预期不匹配,触发异常,程序退出: 一.异常处理:使用try.except进行错误处理 为了保证程序运行的稳定性,错误应该被程序捕捉并合理控制 Python使用保留字try和except进行异常处 ...

  3. 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

    使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定.捕获所有异常.非常适合从头开始,但大公司已经有现成的C++框架.所以不会使用) 参考文章: (1)使用 Go 语言开发大型 MMO ...

  4. c++ 捕获所有异常

    c++ 捕获所有异常 参考文章: (1)c++ 捕获所有异常 (2)https://www.cnblogs.com/zhuyf87/archive/2012/12/28/2836690.html 备忘 ...

  5. 抛出异常和捕获异常_多捕获和最终重新抛出的异常处理

    抛出异常和捕获异常 Joseph D. Darcy宣布,在langtools团队成员Maurizio Cimadamore开发的多捕获实现成功的经验之后,具有多捕获和最终重新抛出的改进的异常处理将成为 ...

  6. Go+ recover

    recover概述 panic用于抛出异常,而recover用于捕获异常,recover是Go+的一个内建函数,recover从字面理解意思是恢复,他可以让你的系统从宕机中恢复过来(捕获异常),虽然程 ...

  7. Go语言 defer

    引言 Go 语言中的 defer 语句是 UNIX 之父 Ken Thompson 大神发明的,是完全正交的设计. 也正因为 Go 语言遵循的是正交的设计, 所以才有了: "少是指数级的多/ ...

  8. golang panic和recover 捕获异常

    func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数. panic的作用就是抛出一条错误信息,从它的参数类型可以看 ...

  9. Go 异常捕获处理: panic(err) 与 recover()

    代码实例 func (rcvr *CQL) Compile(ctx context.Context) string {defer func() {if err := recover(); err != ...

最新文章

  1. 大话RxJava:一、初识RxJava与基本运用
  2. JavaScript String 对象扩展方法
  3. linux命令行怎么注释,Bash Shell 注释多行的几种方法
  4. python基础代码事例-推公式到写代码-python基础
  5. 廖雪峰python教程完整版-为什么看不懂廖雪峰的Python学习教程?
  6. jQuery的选择器——可见性过滤选择器
  7. 七十一、Vue项目城市选择页搜索逻辑实现,边输入边搜索功能的解决办法:节流函数
  8. 辽宁省普通话水平测试软件,辽宁普通话水平测试报名入口
  9. [linux] 进程五状态模型
  10. TCP/IP 原理--链路层
  11. 2021年度训练联盟热身训练赛第一场 E Early Orders 思维 + 栈
  12. java---解析XML文件,通过反射动态将XML内容封装到一个类中
  13. TestNG官方文档中文版(1)-介绍
  14. 关于移动端设备适配的问题
  15. jsp分页代码mysql_jsp分页(jsp分页完整代码)
  16. 从自动驾驶新趋势看普及前景
  17. 3D艺术家推荐——4款最佳3D建模软件
  18. linaro gcc 交叉编译链编译
  19. 与IBM谈判搁浅 Sun及其CEO前景存疑
  20. 每天5分钟玩转Kubernetes | Cluster IP底层实现

热门文章

  1. Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本
  2. 个人财务管理系统有源码怎么用_微信里的客户怎么管理?用鱼汛微信管理系统...
  3. 解决: ubuntu18.04没有网络直连
  4. arch mysql日志位置_MySQL 日志文件与相关参数
  5. vue 鼠标点击事件_VBA代码解决方案第115讲:点击鼠标实现精准控制触发事件的VBA代码第二方案...
  6. WIFI无线路由器的五种工作模式
  7. 《跟我一起写Makefile》读书笔记(3)
  8. shell脚本自动备份MySQL数据库
  9. 201673020127 词频统计软件项目报告
  10. Spring Boot之自定义属性