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语言实现
目录 一.二叉搜索树的相同判断 二.问题引入 三.举例分析 四.方法探讨 4.1 中序遍历 4.2 层序遍历 4.3 先序遍历 4.4 后序遍历 五.总结 六.代码实现 一.二叉搜索树的相同判断 二叉 ...
- TestNG(七)组测试
package com.course.testng.groups; import org.testng.annotations.AfterGroups; import org.testng.annot ...
- 控制执行流程之ForEach语法
1.定义 : 一种更加简洁的for语法,用于数组和容器===>>>foreach,无需创建int类型变量对被访问项构建的序列进行计数. 2.经典应用: 对于数组的初始化,如果选用f ...
- MIT FiveK图像转化--DNG到TIFF,TIFF到JPEG
MIT FiveK图像转化--DNG到TIFF,TIFF到JPEG MIT FiveK数据库是研究图像自动修饰算法会用到的基准数据库,然而那个网页上提供给我们的5000张原始图像的格式为DNG格式(一 ...
- 用call或bind实现bind()
一.bind方法 让我们看一下MDN上对bind方法的解释 bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用 ...
- Spring 梳理-传递模型数据到视图
传递model,返回string,不指定返回key package com.jt; import com.myOrg.DeptUserDomain; @Controller @RequestMappi ...
- spark针对web日志正则匹配
针对于web日志做分析是学习spark常用练习项目.此文介绍web日志正则匹配相关小提示. 实例测试 从网上找了一个access日志案列 218.19.140.242 - - [10/Dec/201 ...
- Java 学习笔记之 实例变量非线程安全
实例变量非线程安全: 如果多个线程共同访问1个对象中的实例变量,则可能出现“非线程安全”问题. public class UnSafeHasSelfPrivateNum { private int n ...
- 手把手教你如何在window下将jenkins+allure集成生成的测试报告通过jenkins配置邮箱自动发送-04(非常详细,非常实用)
简介 上一篇生成测试报告,小伙伴们和童鞋们就又问道,测试报告已经生成了,怎么发送给相关的负责人了?小伙伴们和童鞋们不要着急,听宏哥慢慢给你道来,心急吃不了热豆腐哈.今天这篇文章宏哥就给小伙伴和童鞋们来 ...
- XCTF-web2
这种题目是比较简单地..直接写个小脚本就行了2333 <?php $a=" a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2Z ...