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 捕获异常的更多相关文章

  1. Android 捕获异常并在应用崩溃后重启应用

    问题概述: 在Android应用开发中,偶尔会因为测试的不充分导致一些异常没有被捕获,这时应用会出现异常并强制关闭,这样会导致很不好的用户体验,为了解决这个问题,我们需要捕获相关的异常并做处理. 首先 ...

  2. APP级别处理未捕获异常

    前言: 项目APP有时候会出现Crash,然后就是弹出系统强制退出的对话框,点击关闭APP. 有的APP进行了处理,会发现,当程序出现异常的时候,会Toast一个提示"程序出现异常,3秒后将 ...

  3. 关于未捕获异常的处理(WPF)

    这一篇文章来谈谈对于WPF应用程序开发中的未捕获异常的处理. 首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try-catch的方式.但是总是有一些意外的情况 ...

  4. asp.net开发中常见公共捕获异常方式总结(附源码)

    本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统 ...

  5. oracle plsql 捕获异常和抛出异常

    在写oracle存储过程的时候很多东西放到存储过程里面比如一些判断等,要比在程序逻辑里面简单很多,但是也会涉及到捕获和抛出一样的问题. 捕获异常 语法: 首先定义异常: <异常情况>  E ...

  6. spring中配置了事务,数据业务层捕获异常,事务配置不成功?

    原理:spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常 ...

  7. python使用装饰器捕获异常

    可以编写一个通用的捕获异常的装饰器, 当程序发生异常时可以继续执行后续动作. 尤其适合于使用大量断言的验证性程序. 装饰器的实现原理使用了回调技术. 如下所示, robust 是一个装饰器. 当在普通 ...

  8. Java多线程之捕获异常

    1.主线程不能捕获到子线程的异常 package Thread.Exection; import java.util.concurrent.ExecutorService; import java.u ...

  9. WPF 之 未捕获异常的处理

    首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try…catch的方式.但是总是有一些意外的情况可能会发生,这就导致会出现所谓的“未捕获异常(Unhandle ...

  10. 写一个Windows上的守护进程(7)捕获异常并生成dump

    写一个Windows上的守护进程(7)捕获异常并生成dump 谁都不能保证自己的代码不出bug.一旦出了bug,最好是崩溃掉,这样很快就能被发现,若是不崩溃,只是业务处理错了,就麻烦了,可能很长时间之 ...

随机推荐

  1. centos7.4挂载硬盘

    场景:新网上买了台服务器,有个数据盘需要自己挂载 fdisk -l 能看见有一个85.9g的硬盘 然后mkfs -t ext4 /dev/sdb 格式化硬盘 mkdir /data新建data文件夹用 ...

  2. 从一个数对列中找出素数对用于RAS加密的C++程序

    #include <iostream> #include <cmath> using namespace std; const int n = 10000; int isPri ...

  3. 理解分布式一致性:拜占庭容错与PBFT

    理解分布式一致性:拜占庭容错与PBFT 拜占庭问题 拜占庭容错BFT PBFT(Practical Byzantine Fault Tolerance) why 3f+1 ? PBFT 的优点 PBF ...

  4. Python2 和 Python3的区别

    Python2 和 Python3的区别: 1.python2的默认编码方式是ascii码:python3的默认编码是utf-8. 如果出现乱码或者编码错误,可以使用以下编码在文件头来指定编码: #- ...

  5. 【Linux常见命令】tree命令

    tree - list contents of directories in a tree-like format. tree命令用于以树状图列出目录的内容. 执行tree指令,它会列出指定目录下的所 ...

  6. windows服务程序的编写

    服务编写https://blog.csdn.net/lanuage/article/details/77937407 #include <windows.h> #include <s ...

  7. 学数据库你竟然不用用JAVA写代码,可惜你遇到了我! JAVA连接数据库(JDBC)的安装使用教程

    Step 1 你得有Eclipse 没有出门右拐,我教不了你. Step 2 你得有Mysql MySQL的详细安装过程,我在另一篇博客中给出.戳我 Step 3 安装JDBC 可以去官网下,如果用的 ...

  8. centos7 源码安装nginx

    1. 安装编译所需要的工具包 yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 2. 安装ngi ...

  9. linux关于suid提权笔记

    suid全称是Set owner User ID up on execution.这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执 ...

  10. Codeforces Round #563 (Div. 2) A-D

    A. Ehab Fails to Be Thanos 这个A题很简单,就是排个序,然后看前面n个数和后面的n个数是不是相同,相同就输出-1 #include <cstdio> #inclu ...