recover 没有捕获异常_defer + recover 捕获所有异常
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 捕获所有异常相关推荐
- recover 没有捕获异常_GO语言异常处理机制panic和recover分析
本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...
- Python程序异常处理:try、except、else、finally,捕获指定异常类型、捕获多个异常类型、捕获所有异常类型、捕获异常信息、异常的传递、raise抛出自定义异常
输入与预期不匹配,触发异常,程序退出: 一.异常处理:使用try.except进行错误处理 为了保证程序运行的稳定性,错误应该被程序捕捉并合理控制 Python使用保留字try和except进行异常处 ...
- 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)
使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定.捕获所有异常.非常适合从头开始,但大公司已经有现成的C++框架.所以不会使用) 参考文章: (1)使用 Go 语言开发大型 MMO ...
- c++ 捕获所有异常
c++ 捕获所有异常 参考文章: (1)c++ 捕获所有异常 (2)https://www.cnblogs.com/zhuyf87/archive/2012/12/28/2836690.html 备忘 ...
- 抛出异常和捕获异常_多捕获和最终重新抛出的异常处理
抛出异常和捕获异常 Joseph D. Darcy宣布,在langtools团队成员Maurizio Cimadamore开发的多捕获实现成功的经验之后,具有多捕获和最终重新抛出的改进的异常处理将成为 ...
- Go+ recover
recover概述 panic用于抛出异常,而recover用于捕获异常,recover是Go+的一个内建函数,recover从字面理解意思是恢复,他可以让你的系统从宕机中恢复过来(捕获异常),虽然程 ...
- Go语言 defer
引言 Go 语言中的 defer 语句是 UNIX 之父 Ken Thompson 大神发明的,是完全正交的设计. 也正因为 Go 语言遵循的是正交的设计, 所以才有了: "少是指数级的多/ ...
- golang panic和recover 捕获异常
func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数. panic的作用就是抛出一条错误信息,从它的参数类型可以看 ...
- Go 异常捕获处理: panic(err) 与 recover()
代码实例 func (rcvr *CQL) Compile(ctx context.Context) string {defer func() {if err := recover(); err != ...
最新文章
- 大话RxJava:一、初识RxJava与基本运用
- JavaScript String 对象扩展方法
- linux命令行怎么注释,Bash Shell 注释多行的几种方法
- python基础代码事例-推公式到写代码-python基础
- 廖雪峰python教程完整版-为什么看不懂廖雪峰的Python学习教程?
- jQuery的选择器——可见性过滤选择器
- 七十一、Vue项目城市选择页搜索逻辑实现,边输入边搜索功能的解决办法:节流函数
- 辽宁省普通话水平测试软件,辽宁普通话水平测试报名入口
- [linux] 进程五状态模型
- TCP/IP 原理--链路层
- 2021年度训练联盟热身训练赛第一场 E Early Orders 思维 + 栈
- java---解析XML文件,通过反射动态将XML内容封装到一个类中
- TestNG官方文档中文版(1)-介绍
- 关于移动端设备适配的问题
- jsp分页代码mysql_jsp分页(jsp分页完整代码)
- 从自动驾驶新趋势看普及前景
- 3D艺术家推荐——4款最佳3D建模软件
- linaro gcc 交叉编译链编译
- 与IBM谈判搁浅 Sun及其CEO前景存疑
- 每天5分钟玩转Kubernetes | Cluster IP底层实现
热门文章
- Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本
- 个人财务管理系统有源码怎么用_微信里的客户怎么管理?用鱼汛微信管理系统...
- 解决: ubuntu18.04没有网络直连
- arch mysql日志位置_MySQL 日志文件与相关参数
- vue 鼠标点击事件_VBA代码解决方案第115讲:点击鼠标实现精准控制触发事件的VBA代码第二方案...
- WIFI无线路由器的五种工作模式
- 《跟我一起写Makefile》读书笔记(3)
- shell脚本自动备份MySQL数据库
- 201673020127 词频统计软件项目报告
- Spring Boot之自定义属性