panic发生时, 会导致进程挂掉。为了处理panic, 可以使用recover捕获,然后处理。

下面以下标引用越界问题为例进行说明。

正常情况下,代码中如果出现下标越界,会直接触发panic, 导致进程挂掉。

例如下面的例子:

package main

import (
"fmt" ) func main() {
fmt.Println("start...") count := []int{}
fmt.Println(count[1]) fmt.Println("1...") }

output:

start...

panic: runtime error: index out of range

goroutine 1 [running]:

main.main()

D:/work/go_exercise/t.go:29 +0xd4

recover的使用

进程crash后,无法再提供服务,必须设法避免。

Go语言中提供recover可以用于捕获panic。

当对某些代码质量问题存在疑问时,可使用recover进行异常处理。

package main

import (
"fmt" ) func main() {
defer func(){ if r := recover(); r != nil {
fmt.Println("recover...:", r)
}
}() fmt.Println("start...") count := []int{}
fmt.Println(count[1]) fmt.Println("1...") }

output:

start...

recover...: runtime error: index out of range

使用recover后 ,虽然出现越界问题,但程序仍能正常结束。

golang panic的捕获的更多相关文章

  1. Golang panic用法

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  2. golang panic and recover

    panic 是一个内置函数,当一个函数 F 调用 panic,F 的执行就会停止,F 中 deferred 函数调用会被执行,然后 F 返回控制到它的调用者.这个过程会沿着调用栈执行下去,直到当前 g ...

  3. ARTS-S golang panic返回默认值

    package main import "fmt" func fn_test_panic() (a int) { a = 2 panic("This is panic&q ...

  4. Linux信号与golang中的捕获处理

    什么是信号 在计算机科学中,信号是Unix.类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式.它是一种异步的通知机制,用来提醒进程一个事件已经发生. 当一个信号发送给一个进程, ...

  5. golang 用defer 捕获error 需小心

    有时一个函数内需要根据最后是否出错,决定是否执行某个操作.这时候如果函数的分支又比较多,就会比较麻烦了. defer 处理这个情况刚好合适 func main() { var err error by ...

  6. golang语法笔记

    开始微服务,那就先温习下golang语法吧; golang变量类型 1. 整形 Go %b    表示为二进制 %c    该值对应的unicode码值 %d    表示为十进制 %o    表示为八 ...

  7. defer,panic,recover

    Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个 ...

  8. go语言学习--channel的关闭

    在使用Go channel的时候,一个适用的原则是不要从接收端关闭channel,也不要在多个并发发送端中关闭channel.换句话说,如果sender(发送者)只是唯一的sender或者是chann ...

  9. 一文搞懂如何实现 Go 超时控制

    为什么需要超时控制? 请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义 过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至出现不可用事故 Go 超时控制必要 ...

随机推荐

  1. DB2默认的事务及并发锁机制

    今天有点时间,试验了一下DB2的并发锁机制,结果,和MSSQL的差不多:1.DB2的缺省行为,事务以可执行的SQL开始,以COMMIT或ROLLBACK结束:2.DB2缺省是否提交,以工具的不同而不同 ...

  2. BZOJ3895 取石子

    Orz PoPoQQQ 我等蒟蒻只能想到石子数 ≥ 2时的情况...1的时候就爆搜?大概是这个意思 最后再记忆化一下 /**************************************** ...

  3. bzoj2662

    题解: spfa最短路径 dp[i][j]表示到i,用了j掌权 然后转移 代码: #include<bits/stdc++.h> using namespace std; ; int n, ...

  4. Microsoft 数据访问组件 (MDAC) 的版本历史记录

    http://support.microsoft.com/kb/231943/zh-cn http://support.microsoft.com/kb/301202

  5. DevExpress v18.1新版亮点——WinForms篇(二)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v18.1 的新功能,快来下载试用新版本! ...

  6. GitLab项目迁移到Gerrit

    1.在Gerrit上新建项目: 2.Gerrit项目配置权限(此处非代码): Reference:refs/* Push Annotated Tag Push Signed Tag Forge Com ...

  7. C#读写基恩士PLC 使用TCP/IP 协议 MC协议

    本文将使用一个Github开源的组件库技术来读写基恩士PLC数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 g ...

  8. google-protobuf安装详解

    前言 编译调试项目的过程中涉及到caffe的编译,提示没有安装protobuf的错误,本文详解protobuf的安装: 问题描述 解决步骤 1.查看google protobuf的github,没有直 ...

  9. 将Mat类型坐标数据生成pts文件

    前言 获取人脸特征点的坐标信息之后,想要将坐标信息shape保存为pts/asf/txt等文件格式,本文就对此进行实现. 实现过程 1.确定pts文件的书写格式: 以要生成的文件为例,书写格式如下: ...

  10. DHT11

    主机开始发送信号:先拉低至少18ms,然后在拉高20~40us,然后DHT11响应, 拉低数据线40~50us,接着在拉高40~50us,之后再开始输出数据. 输出0是的时序:先12.14us低电平, ...