go-异常处理-error-panic-recover
Go语言的函数可以一次返回多个结果。这就为我们温和地报告错误提供了语言级别的支持。
func readFile(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
return ioutil.ReadAll(file)
}
函数readFile有两个结果声明。第二个结果声明的类型是error。
error是Go语言内置的一个接口类型。它的声明是这样的:
type error interface {
Error() string
}
errors.New是一个很常用的函数。在Go语言标准库的代码包中有很多由此函数创建出来的错误值。
if path == "" {
return nil, errors.New("The parameter is invalid!")
}
panic
panic可被意译为运行时恐慌。因为它只有在程序运行的时候才会被“抛出来”。
内建函数panic可以让我们人为地产生一个运行时恐慌。
不过,这种致命错误是可以被恢复的,在Go语言中,内建函数recover就可以做到这一点。
内建函数panic和recover是天生的一对。
前者用于产生运行时恐慌,而后者用于“恢复”它。
不过要注意,recover函数必须要在defer语句中调用才有效。
因为一旦有运行时恐慌发生,当前函数以及在调用栈上的所有代码都是失去对流程的控制权。
只有defer语句携带的函数中的代码才可能在运行时恐慌迅速向调用栈上层蔓延时“拦截到”它。
defer func() {
if p := recover(); p != nil {
fmt.Printf("Fatal error: %s\n", p)
}
}()
我们调用了recover函数。该函数会返回一个interface{}类型的值。
interface{}代表空接口。
Go语言中的任何类型都是它的实现类型。
把这个值赋给了变量p。如果p不为nil,那么就说明当前确有运行时恐慌发生。
这时我们需根据情况做相应处理。
注意,一旦defer语句中的recover函数调用被执行了,运行时恐慌就会被恢复,不论我们是否进行了后续处理。
所以,我们一定不要只“拦截”不处理。
反观panic函数。
该函数可接受一个interface{}类型的值作为其参数。
也就是说,我们可以在调用panic函数的时候可以传入任何类型的值。
不过,我建议大家在这里只传入error类型的值。
这样它表达的语义才是精确的。
更重要的是,当我们调用recover函数来“恢复”由于调用panic函数而引发的运行时恐慌的时候,
得到的值正是调用后者时传给它的那个参数。
因此,有这样一个约定是很有必要的。
运行时恐慌代表程序运行过程中的致命错误。我们只应该在必要的时候引发它。
人为引发运行时恐慌的方式是调用panic函数。
recover函数是我们常会用到的。
因为在通常情况下,我们肯定不想因为运行时恐慌的意外发生而使程序崩溃。
最后,在“恢复”运行时恐慌的时候,大家一定要注意处理措施的得当。
package main import (
"fmt"
) func testa(num int) {
defer func() {
//返回错误信息
if err := recover(); err != nil {//
fmt.Println(err)
}
}() var a []int
a[num] =
fmt.Println("normal")
} func main() {
testa()
}
go-异常处理-error-panic-recover的更多相关文章
- [Go] 如何正确地 抛出 错误 和 异常(error/panic/recover)?
序言 错误 和 异常 是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从表面上看,一切皆错误的思路 ...
- Go语言异常处理defer\panic\recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- Go的异常处理 defer, panic, recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- go panic recover 异常处理
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- Go语言中异常处理painc()和recover()的用法
Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调 ...
- defer,panic,recover
Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个 ...
- 探究 Go 源码中 panic & recover 有哪些坑?
转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/627 本文使用的go的源码1.17.3 前言 写这一篇文章的原因是 ...
- go语言defer panic recover用法总结
defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...
- defer, panic, recover使用总结
1. defer : 延迟调用.多个defer,依次入栈,在函数即将退出时,依次出栈调用 package main import "fmt" func main() { defer ...
- go chapter 5 - 异常处理 error、panic、recover
https://blog.csdn.net/tennysonsky/article/details/78946265 error(不中断).panic(中断).recover(拦截中断 类似于 ca ...
随机推荐
- 基于python-django框架的支付宝支付案例
目录 @ 一. 开发前的准备 1. 必须了解的知识 SDK:软件开发工具包,可以为开发者提供快速开发的工具 沙箱环境:也就是测试环境 支付宝支付金额的精度:小数点后两位(面试) 支付宝用的什么加密方式 ...
- Hive导入数据到HBase,再与Phoenix映射同步
1. 创建HBase 表 create 'hbase_test','user' 2. 插入数据 put 'hbase_test','111','user:name','jack' put 'hbase ...
- 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?
Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...
- CDH健康检查报DATA_NODE_BLOCK_COUNT告警
告警原文: The health test result for DATA_NODE_BLOCK_COUNT has become concerning: The DataNode has 500,0 ...
- Android 禁止Edittext弹出系统软键盘 的几种方法
第一种方法:在XML文件下添加: android:focusable="true" android:focusableInTouchMode="true" 第二 ...
- 阿里云服务器CentOS6.9安装Mysql
上篇讲了CentOS6.9安装tomcat,这篇来讲mysql的安装 1.查看CentOS是否安装了MySQL yum list installed | grep mysql //查看CentOS是否 ...
- maven scope属性说明
一.scope属性: 依赖范围控制哪些依赖在哪些classpath 中可用,哪些依赖包含在一个应用中. compile (编译) compile是默认的范围:如果没有提供一个范围,那该依赖的范围就是编 ...
- 【ADO.NET基础-GridView】GridView的编辑、更新、取消、删除以及相关基础操作代码
代码都是基础操作,后续功能还会更新,如有问题欢迎提出和提问....... 前台代码: <asp:GridView ID=" OnRowDataBound="GridView1 ...
- Ansible常用模块基本操作
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. 前言 对于任何一个框架,一个应用,为了更便于推广,便于使用,便于商业化,都会顺便提 ...
- Basic Example using SMTP (for PHPMailer v5.0.0 and up)
sample as below: require_once('../class.phpmailer.php'); //include("class.smtp.php"); // o ...