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 ...
随机推荐
- [Pandas] 05 - Parallel processing
相关资源 [Python] 09 - Multi-processing [Pandas] 01 - A guy based on NumPy [AI] 深度数学 - Bayes 这章非常有意思,但一定 ...
- [LeetCode]Power of N
题目:Power of Two Given an integer, write a function to determine if it is a power of two. 题意:判断一个数是否是 ...
- C++基础之泛型算法
标准库并未给每个容器添加大量功能,因此,通过大量泛型算法,来弥补.这些算法大多数独立于任何特定的容器,且是通用的,可用于不同类型的容器和不同的元素. 迭代器使得算法不依赖容器,但是算法依赖于元素的类型 ...
- Spring Boot 的单元测试和集成测试
学习如何使用本教程中提供的工具,并在 Spring Boot 环境中编写单元测试和集成测试. 1. 概览 本文中,我们将了解如何编写单元测试并将其集成在 Spring Boot 环境中.你可在网上找到 ...
- (七十五)c#Winform自定义控件-控件水印组件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- 1,eclipse导入项目jdk版本不一样解决方案 2,java报javax.servlet.jsp cannot be resolved to a type
一:eclipse导入项目jdk版本不一样解决方案 参考博文: https://www.cnblogs.com/chenmingjun/p/8472885.html 选中项目右键 --> Pro ...
- Intellij IDEA 2019 + Java Spring MVC + Hibernate学习笔记(2)
书接上文 首先根据各种Spring MVC教程,建立了基础的结构,是否合理不知道,姑且先这样,有问题再解决问题.学习新东西,不能怕掉坑里... 查询网上别人的经历说需要把根目录下的lib目录下的所有包 ...
- vue-router路由元信息及keep-alive组件级缓存
路由元信息?(黑人问号脸???)是不是这么官方的解释很多人都会一脸懵?那么我们说meta,是不是很多人恍然大悟,因为在项目中用到或者看到过呢? 是的,路由元信息就是我们定义路由时配置的meta字段:那 ...
- 小型APP系统开发与应用项目实训
实训项目 : 小型APP系统开发与应用项目实训 项目成品名称: 果乐多商城 项 ...
- 读《深入理解Elasticsearch》点滴-查询分类
1.如何分类,略.个人不接受书中的分类方法,建议采用官网上的分类方法 2.term查询,可以模拟No-SQL数据库