关于panic ,主协程的recover 是无法获取 子协程的panic 的
一、子协程的panic,只能在子协程中处理
下面的代码,main 函数 无法获取panic
package main
import (
"fmt"
"time"
)
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
go test()
time.Sleep(time.Second)
}
func test() {
test1()
}
func test1() {
panic("我错了")
}
二、子协程处理panic
package main
import (
"fmt"
"time"
)
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
go test()
time.Sleep(time.Second)
}
func test() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
test1()
}
func test1() {
panic("我错了")
}
三、一个协程中才能后获取panic,最上层的能够获取下面的panic
如下代码main函数可以获取test1 函数中的panic
package main
import (
"fmt"
)
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
test()
}
func test() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
test1()
}
func test1() {
panic("我错了")
}
关于recover 获取panic的原则
1、recover 只能获取同协程内的panic
2、defer 获取recover 只能在直接func 内获取,不能再跨一个func
3、panic(err) err != nil
关于panic ,主协程的recover 是无法获取 子协程的panic 的的更多相关文章
- Kotlin协程解析系列(上):协程调度与挂起
vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建.协程调度与协程挂起相关的内容 一.协程引入 Kotlin 中引入 Corout ...
- go语言之进阶篇主协程先退出导致子协程没来得及调用
1.主协程先退出导致子协程没来得及调用 示例: package main import ( "fmt" "time" ) //主协程退出了,其它子协程也要跟着退 ...
- Stackful 协程库 libgo(单机100万协程)
libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库. 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第 ...
- libaco: 一个极速的轻量级 C 非对称协程库 🚀 (10 ns/ctxsw + 一千万协程并发仅耗内存 2.8GB + Github Trending)
0 Name 简介 libaco - 一个极速的.轻量级.C语言非对称协程库. 这个项目的代号是Arkenstone
- 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页
协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...
- Python异步IO之协程(二):使用asyncio的不同方法实现协程
引言:在上一章中我们介绍了从yield from的来源到async的使用,并在最后以asyncio.wait()方法实现协程,下面我们通过不同控制结构来实现协程,让我们一起来看看他们的不同作用吧- 在 ...
- 一个7重嵌套表EF添加语句,注意子表赋值过程中只需写子表主键赋值,不需要写子表外键=父表主键。EF创建时会自动将子表外键设为与父表主键相等
AIRPORT_HELIPORT tt = new AIRPORT_HELIPORT() { AIRPORT_HELIPORT_UUID = Gui ...
- ARTS-S C语言主线程获取子线程返回值
#include<stdio.h> #include<stdlib.h> #include <pthread.h> typedef struct { int stu ...
- QT多线程的简单使用,主线程发一份数据,子线程收两份数据
先看效果图,示例发送数据"Hello World" 主线程:0x16f54aeda20,另两个子线程分别是0x4f1baff690.0x4f1baff6a0 因为在子线程中加了20 ...
随机推荐
- 使用VC6.0开发COM组件 - 傻瓜式,不讲理论,只讲实例
1.创建一个ATL COM AppWizard工程,如图:
- jvm系列(五):jvm调优-从eclipse开始
概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程栈来分析代码中不合理的地方给予改进 ...
- ajax前后台通信验错
目录 默认contenType下 总结以下例证: 1.当为简单JSON时 ajax controller vo 2.当为复杂JSON的时候 ajax controller vo 结果 contentT ...
- springboot使用redis(从配置到实战)
概述 springboot通常整合redis,采用的是RedisTemplate的形式,除了这种形式以外,还有另外一种形式去整合,即采用spring支持的注解进行访问缓存. 准备工作 pom.xml ...
- 回顾games101中的SSAA和MSAA
回顾games101中的AA(抗锯齿) 前言 善于进行课后总结,可以更加巩固自己的知识和具体细节 锯齿(走样)产生的原因 本质上,在光栅化阶段中,用有限离散的数据想表示连续的(类似三角形的某一边),就 ...
- 用Java8把List转为Map
1 import com.yang.test.User; 2 3 import javax.jws.soap.SOAPBinding; 4 import java.util.*; 5 import j ...
- Spring系列之集成Druid连接池及监控配置
前言 前一篇文章我们熟悉了HikariCP连接池,也了解到它的性能很高,今天我们讲一下另一款比较受欢迎的连接池:Druid,这是阿里开源的一款数据库连接池,它官网上声称:为监控而生!他可以实现页面监控 ...
- Linux下修改mysql默认最大连接数
liunx下修改mysql最大连接数(Centos下测试通过)1.查看当前系统下mysql设置的最大连接数方式一.mysqladmin -uroot -p variables |grep max_co ...
- Ubuntu 16.04 + python3 源码 安装+使用labelImg最新版
安装 sudo apt-get update sudo apt-get upgrade sudo apt install python3-pip git clone https://github.co ...
- MySQL-LSN
查看lsn: show engine innodb status Log sequence number 2687274848548 Log flushed up to 2687274848 ...