5.7 Go 捕获异常
5.7 Go 捕获异常
Go语言处理异常不同于其他语言处理异常的方式。
传统语言处理异常:
try
catch
finally
go语言
引入了defer、panic、recover
1.Go程序抛出一个panic异常,在defer中通过recover捕获异常,然后处理
2. defer与recover捕获异常
package main import "fmt" func test() {
//在函数退出前,执行defer
//捕捉异常后,程序不会异常退出
defer func() {
err := recover() //内置函数,可以捕捉到函数异常
if err != nil {
//这里是打印错误,还可以进行报警处理,例如微信,邮箱通知
fmt.Println("err错误信息:", err)
}
}() //如果没有异常捕获,直接报错panic,运行时出错
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res结果:", res) } func main() {
test()
fmt.Println("如果程序没退出,就走我这里")
}
在goroutine中使用recover捕获异常
在goroutine中如果出现了panic,整个程序也会崩溃,因此在goroutine中进行异常捕获,保障程序正常运转。
示例代码
package main import (
"fmt"
"time"
) func test() {
for i := 0; i < 10; i++ {
time.Sleep(time.Second)
fmt.Println("你好,大妹子,我是你表哥")
}
} func test2() {
//测试一个异常goroutine
//使用defer+recover捕获异常
defer func() {
//匿名函数来捕获异常
if err := recover(); err != nil {
fmt.Println("test2函数出错,", err)
}
}() //主动模拟异常,对一个未初始化的map赋值,引出panic异常
var myMap map[int]string
myMap[0] = "你妹呀"
} func main() {
go test()
go test2() time.Sleep(time.Second * 10)
}
2.1.1. Errors包
package main import (
"errors"
"fmt"
) func checkAge(age int) error {
if age < 0 {
err := fmt.Errorf("输入年龄不合法")
return err
}
fmt.Println("年龄是:", age)
//正常error类型返回nil,代表无错
return nil
} func main() {
//New函数,返回一个结构体对象
err1 := errors.New("自定义的错误信息,你看我好玩吗")
fmt.Println(err1.Error()) //调用Error方法
fmt.Printf("%T\n", err1) //结构体指针对象 //创建error另一个方法,其实也是通过erros.New()创建的
err2 := fmt.Errorf("自定义错误状态码:%d", 500)
fmt.Printf("%T\n", err2) //结构体指针对象
fmt.Println(err2.Error()) //测试error
err3:=checkAge(-1)
if err3!=nil{
fmt.Println(err3.Error())
return
}
fmt.Println("程序正常运行")
}
5.7 Go 捕获异常的更多相关文章
- Android 捕获异常并在应用崩溃后重启应用
问题概述: 在Android应用开发中,偶尔会因为测试的不充分导致一些异常没有被捕获,这时应用会出现异常并强制关闭,这样会导致很不好的用户体验,为了解决这个问题,我们需要捕获相关的异常并做处理. 首先 ...
- APP级别处理未捕获异常
前言: 项目APP有时候会出现Crash,然后就是弹出系统强制退出的对话框,点击关闭APP. 有的APP进行了处理,会发现,当程序出现异常的时候,会Toast一个提示"程序出现异常,3秒后将 ...
- 关于未捕获异常的处理(WPF)
这一篇文章来谈谈对于WPF应用程序开发中的未捕获异常的处理. 首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try-catch的方式.但是总是有一些意外的情况 ...
- asp.net开发中常见公共捕获异常方式总结(附源码)
本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统 ...
- oracle plsql 捕获异常和抛出异常
在写oracle存储过程的时候很多东西放到存储过程里面比如一些判断等,要比在程序逻辑里面简单很多,但是也会涉及到捕获和抛出一样的问题. 捕获异常 语法: 首先定义异常: <异常情况> E ...
- spring中配置了事务,数据业务层捕获异常,事务配置不成功?
原理:spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常 ...
- python使用装饰器捕获异常
可以编写一个通用的捕获异常的装饰器, 当程序发生异常时可以继续执行后续动作. 尤其适合于使用大量断言的验证性程序. 装饰器的实现原理使用了回调技术. 如下所示, robust 是一个装饰器. 当在普通 ...
- Java多线程之捕获异常
1.主线程不能捕获到子线程的异常 package Thread.Exection; import java.util.concurrent.ExecutorService; import java.u ...
- WPF 之 未捕获异常的处理
首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try…catch的方式.但是总是有一些意外的情况可能会发生,这就导致会出现所谓的“未捕获异常(Unhandle ...
- 写一个Windows上的守护进程(7)捕获异常并生成dump
写一个Windows上的守护进程(7)捕获异常并生成dump 谁都不能保证自己的代码不出bug.一旦出了bug,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之 ...
随机推荐
- iOS Block 页面传值
为什么80%的码农都做不了架构师?>>> 直接上代码 1.定义block @interface TopTypeCollectionView : UIView @property ...
- 企业云桌面-03-安装第1个企业 CA-013-CA01
作者:学 无 止 境 QQ交流群:454544014 注意: <企业云桌面>系列博文是<企业云桌面规划.部署与运维实践指南>的基础部分,因为书中内容涉及非常多,非常全面,所以基 ...
- ip地址与运算 ipcalc命令
http://man.linuxde.net/ipcalc 转载于:https://blog.51cto.com/sonlich/2064133
- Codeforces Round #590
题目链接:Round #590 题目答案:官方Editorial.My Solution A. Equalize Prices Again 签到题还WA了一发,向上取整有点问题: //my wrong ...
- POJ 1170 Shopping Offers非状态压缩做法
Shopping Offers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5659 Accepted: 2361 Descr ...
- 数学--数论--HDU 5382 GCD?LCM?(详细推导,不懂打我)
Describtion First we define: (1) lcm(a,b), the least common multiple of two integers a and b, is the ...
- P3306 [SDOI2013]随机数生成器(bzoj3122)
洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...
- IP 基础知识全家桶,45 张图一套带走
前言 前段时间,有读者希望我写一篇关于 IP 分类地址.子网划分等的文章,他反馈常常混淆,摸不着头脑. 那么,说来就来!而且要盘就盘全一点,顺便挑战下小林的图解功力,所以就来个 IP 基础知识全家桶. ...
- 「译」JVM是如何使用那些你从未听过的x86魔幻指令实现String.compareTo的
原文https://jcdav.is/2016/09/01/How-the-JVM-compares-your-strings/ 魔幻的String.compareTo 我们之前可能已经见过Java的 ...
- SSM整合案例:图书管理系统
目录 SSM整合案例:图书管理系统 1.搭建数据库环境 2.基本环境搭建 2.1.新建一个Maven项目,起名为:ssmbuild,添加web的支持 2.2.导入pom的相关依赖 2.3.Maven静 ...