-
加了tags 和 categories报错
2020-12-29 01:44:40: create a template below /layouts with one of these filenames: posts/posts.en.html.html, posts/section.en.html.html, posts/list.en.html.html, posts/posts.html.html, posts/section.html.html, posts/... -
Conflict with my .vimrc?
2021-01-12 08:48:05除了 $ ^ 之外其他元字符都要加反斜杠。 set hlsearch " 高亮 Search 的东西 <p>" 编码设置 {<!-- -->{<!-- -->{2 " ================... -
Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615
2015-06-12 16:38:05用户可以参照English.lng语言文件的格式和内容,方便地编制修改自己的语言文件,比如French.lng。用户只需将自己编制好的语言文件拷贝到本程序目录下,重新启动程序后便会自动在“关于->语言”菜单下列出用户添加的... -
Radmin自动登录器v2.0-多国语言绿色版-Release9-20140109-5
2014-03-04 10:02:08v1.5及以前的老版本都是用AutoIt语言开发的,AutoIt是解释性语言,功能和稳定性有限,并且一些防病毒软件会报警。 为了在功能和稳定性方面进一步提高和改进,新版本使用VC++ Unicode(MFC)环境编程,程序在编译时... -
MD5加密算法(Java语言描述)
2012-07-21 23:28:45这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。 F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。 假设Mj表示消息的第j个子分组(从0... -
golang errors 取 错误 信息_使用 Panic、Defer 和 Recover 处理 Go 错误
2021-01-12 01:04:25点击上方蓝色“Golang来啦”关注我哟加个“星标”,天天 15 分钟,掌握 Go 语言via:https://medium.com/technofunnel/error-handling-in-golang-with-panic-defer-and-recover-d77db7ae3875作者:Mayank Gupta四哥...点击上方蓝色“Golang来啦”关注我哟
加个“星标”,天天 15 分钟,掌握 Go 语言
via:
https://medium.com/technofunnel/error-handling-in-golang-with-panic-defer-and-recover-d77db7ae3875
作者:Mayank Gupta四哥水平有限,如有翻译或理解错误,烦请帮忙指出,感谢!
文章源自 Medium,点赞超过 700+。
原文如下:
这篇文章主要会与大家介绍 Go 语言的错误处理。
我们将会讨论关于 Go 语言创建和捕获自定义、运行时错误的一些简单方法。Go 提供了简单方法实现。
Go 提供了简单的错误接口,每个返回错误都必须实现这个接口。
type error interface {
Error() string
}创建用户自定义错误
我们可以使用 Go 语言创建简单的用户自定义错误,就像下面这样:
package main
import (
"errors"
"fmt"
)
func calculateArea(radius int) (int, error) {
if radius 0 {
return 0, errors.New("Provide Positive Number")
}
return radius * radius, nil
}上面代码很简单,求一个圆的面积,必须保证 radius 是正数。如果参数是负数,将会返回 0 与 用户自定义错误,该自定义错误使用 errors.New() 生成。该函数返回 error 类型的对象并可携带用户自定义错误信息。我们使用负数调用函数,这样调用时就能返回错误:
package main
import (
"errors"
"fmt"
)
func calculateArea(radius int) (int, error) {
if radius 0 {
return 0, errors.New("Provide Positive Number")
}
return radius * radius, nil
}
func main() {
areaValue, err := calculateArea(-1)
if err != nil {
fmt.Println("Error Encountered...")
return
}
fmt.Println(areaValue)
}在 main 函数里,我们使用负数调用函数 calculateArea()。参数是负数,所以会返回 error 对象。函数执行完会返回两个值,第一个是面积,第二个是 error 对象。上面的代码,我们会检查函数返回的 error 对象是否是 nil,如果是,函数将会继续执行;否则,错误返回并打印错误信息。
创建自定义函数时,我们应当保证能返回正常值和错误状态。上面的代码展示了处理错误的场景。函数抛出错误的场景有很多,我们也需要研究如何处理这些错误。让我们一起来深入研究下这些方法。
关键字 Defer、Panic 和 Recover
使用 defer 关键字
defer 函数会在调用它的函数返回之前被立即调用;
可以放在函数的任何位置;
可以使用 defer 定义释放资源函数;
defer 函数会被执行即使发生报错;
让我们通过一段小程序理解下:
package main
import "fmt"
func returnMessage() {
fmt.Println("This is Simple Defer Function Execution")
}
func main() {
defer returnMessage()
fmt.Println("This is line One")
fmt.Println("This is line Two")
fmt.Println("This is line Three")
}上面的代码在 main() 函数里使用 defer 关键字定义 returnMessage() 函数调用。一旦主函数执行,在主函数返回之前就会执行 returnMessage() 调用。输出如下:
即使调用 returnMessage() 函数的代码写在主函数的第一行,实际却是在主函数返回之前发生调用。这就是 Go 语言里面 defer 关键字的工作原理。
使用 Panic 关键字
panic 可以用来终止程序并且可以自定义错误信息。当发生 panic 时,会发生如下情况:
当前执行函数立即终止;
defer 定义的任何函数将会被执行;
整个程序会终止;
我们来看下关于 panic 的例子:
package main
import "fmt"
func executePanic() {
panic("This is Panic Situation")
fmt.Println("The function executes Completely")
}
func main() {
executePanic()
fmt.Println("Main block is executed completely...")
}上面的代码,在 executePanic() 函数里调用了 panic 函数,一旦 panic 执行,整个程序终止,所以输出如下:
当 panic 函数被调用时,程序会在第 6 行代码退出。panic 函数是另外一种提示发生错误并终止程序的方式,并且还可以自定义错误信息。
defer 与 panic 一起使用
前面说过,如果程序发生 panic,将会调用所有与当前执行线程相关的 defer 函数。defer 函数可以用来释放资源。defer 函数将会在当前执行函数终止之前调用。
一起来看下例子:
package main
import "fmt"
func recoveryFunction() {
fmt.Println("This is recovery function...")
}
func executePanic() {
defer recoveryFunction()
panic("This is Panic Situation")
fmt.Println("The function executes Completely")
}
func main() {
executePanic()
fmt.Println("Main block is executed completely...")
}上面的代码,在 executePanic() 函数里定义了 defer 函数和 panic 函数。看下输出:
上面的代码,当执行到 panic 函数时,会立即调用 defer 函数。从执行情况可以看出,defer 函数在程序终止之前会被调用。一旦发生 panic ,所有 defer 函数都会在程序终止之前被调用。
使用 Recovery
一旦发生 panic,程序将会终止。然而在实际生产环境中,发生错误终止的情况是不允许的。我们需要一种从错误中恢复的机制,通过恢复代码避免程序的意外终止。
无论执行函数是否会不会发生 panic,函数返回时,defer 函数总是会被执行。我们可以在 defer 函数中编写恢复代码。
检测 panic 情况
在 defer 定义的函数中,我们需要检测程序执行时是否发生过 panic 的情况。为了能够检测出,我们需要执行 recover 函数。一旦我们执行了 recover 函数,就可以接收到 panic 函数传递的错误信息。这些错误信息作为 panic 的返回输出到 recover 函数。我们不允许正在执行的程序发生意外终止,而是要重新获得对程序的控制。程序控制权重新交还给调用函数,这样调用函数便可以接着向下继续执行。一起来看下例子:
package main
import "fmt"
func recoveryFunction() {
if recoveryMessage := recover(); recoveryMessage != nil {
fmt.Println(recoveryMessage)
}
fmt.Println("This is recovery function...")
}
func executePanic() {
defer recoveryFunction()
panic("This is Panic Situation")
fmt.Println("The function executes Completely")
}
func main() {
executePanic()
fmt.Println("Main block is executed completely...")
}上面的代码,在 defer 函数内部,我们调用了 recover 函数,该函数返回 panic 抛出的错误信息。因为我们使用了 recover 函数,所以程序并不会立即终止。相反,程序的控制权将会返回给主函数并得以继续执行。看下输出:
我们可以看到,程序并未异常终止。调用函数正常执行并返回 main() 函数,主函数继续运行。
推荐阅读:
深入理解 Defer 函数
5 年 Gopher 都不知道的 defer 细节,你别再掉进坑里!
如果我的文章对你有所帮助,点赞、转发都是一种支持!
给个[在看],是对四哥最大的支持
-
// // 中间件 在这里可以做 权限验证 数据加解密 等等 // 'middle' => [ // TestMiddle::class . '@aa' // ], // // 缓存 如果设置了 当以同样的参数调用时 会返回缓存信息 不会真正调用 单位:秒 // 'cache' =>...
-
JavaScript基础和实例代码
2009-03-20 16:49:302.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本处理流程 2.8.2 if... -
in _load_config_files config = loader.load_config() file "f:\conda\anaconda\envs\machinelearning\...
【入门教程】强烈推荐: PyTorch 自然语言处理: https://github.com/apachecn/NLP-with-PyTorch Python 自然语言处理 第二版: https://usyiyi.github.io/nlp-py-2e-zh 推荐一个liuhuanyong大佬整理的nlp全面知识... -
测试脚本只能使用Java语言 2. 测试脚本要打包成jar或者apk包上传到设备上才能运行。 我们希望测试逻辑能够用Python编写,能够在电脑上运行的时候就控制手机。这里要非常感谢 Xiaocong He (@xiaocong),他将这个想法...
-
简历英文自我介绍的范文.doc
2021-01-18 16:32:40简历英文自我介绍的范文 英语的自我介绍主要考查的是我们运用语言的能力,这个能力是可以培养和加强的。那么英语的简历自我介绍该怎么写呢?今天小编和你分享简历英文自我介绍的范文,欢迎阅读。简历英文自我介绍的... -
组内repo盘点
2020-12-08 20:12:56四大主题(中文命名, 汉化API, 汉化现有语言, 创立新语言)详见中文编程专栏目录, 初衷和希冀 - [x] <a href="https://github.com/program-in-chinese/overview/issues/2">社区运行方式讨论, 迎新 - [x] 商业化和推广 ... -
面试自我介绍的英语短文.doc
2021-01-19 11:29:57面试自我介绍的英语短文 英语的自我介绍主要考查的是我们运用语言的能力,这个能力是可以培养和加强的。那么你知道英语的自我介绍短文该怎么说吗?下面小编为你整理了面试自我介绍的英语短文,欢迎阅读。面试自我介绍... -
an image is worth 16*16 words: transformers for image recognition at scale
2020-10-21 16:51:37an image is worth 16*16 words: transformers ...在大规模的图像识别中ResNet50仍是最新的技术,由于自注意力加卷积的速度和可扩展性差。with the fewest possible modifications用最少的修改。 we split an image inan image is worth 16*16 words: transformers for image recognition at scale
变压器 for 大规模图像识别。变压器用于自然语言处理,计算机视觉,变压器,图像分类,图像补丁序列时。自注意力,变压器的计算效率和可扩展性。在大规模的图像识别中ResNet50仍是最新的技术,由于自注意力加卷积的速度和可扩展性差。with the fewest possible modifications用最少的修改。 we split an image into patches and provide the sequence of linear embeddings of these patches as an input to a Transformer.Such models yield modest results这样的模型产生恰当的结果。归纳偏差,等方差和局部性,数据量不足的情况下。Transformers attain excellent results when pre-trained at sufficient scale and transferred to tasks with fewer datapoints.变压器 机器翻译 不了解变压器的先前应用 with 对整个图像的自注意力。iGPT将变压器应用于图像像素 after 减少图像分辨率 和颜色空间。
ResNet的中间特征图 被早期阶段所取代 一个通道的特征图被展开成一个序列 维度 变压器 分类输入嵌入和位置嵌入。 -
截至2015年12月,超过4000名用户加群或研究讨论或测试或使用Mycat。 Mycat是基于开源cobar演变而来,我们对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性...
-
维基百科:数学基础(zslcn周生烈编译摘注评)
2014-02-06 21:54:45数学基础研究基本数学概念(数、几何形状、集合、函数...),及其 如何构成更复杂结构和概念的 层次结构,特别是一类 也被称为元数学概念的 基础性重要结构,用它们来形成数学语言(公式、理论、以及它们的 用来表意... -
关于ESL课堂中的文化适应能力的可行性研究报告.doc
2021-01-18 19:13:00关于ESL课堂中的文化适应能力的可行性研究报告 在当今的ESL...Bryram认为,Along with knowledge of ones own and other cultures,interculturality involves attitudes of curiosity and openness,skills in int... -
PHPershou.zip
2019-09-11 09:19:15Now, with the continuous development of e-commerce perfect, University campus also needs an able to provide our students with the second-hand goods transactions dedicated web site, in order to ... -
Radmin自动登录器v3.0
2018-01-06 16:04:23用户可以参照English.lng语言文件的格式和内容,方便地编制修改自己的语言文件,比如French.lng。用户只需将自己编制好的语言文件拷贝到本程序目录下,重新启动程序后便会自动在“关于->语言”菜单下列出用户添加的... -
SQL沉思录(世界级SQL专家经典著作)--详细书签版
2013-02-04 13:08:03最后,人们才能轻松地以该语言来思考和表述,并且不需要再刻意关注语言本身。 SQL编程的初级阶段只不过是闭着眼睛从别人的程序中把现有的代码复制过来,这并不是真正的编程。人们可能还会使用一种具有图形用户... -
源文件程序天下JAVASCRIPT实例自学手册随书代码
2012-05-05 23:36:452.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本处理流程 2.8.2 if... -
源文件程序天下JAVASCRIPT实例自学手册
2012-05-05 23:47:122.7.5 自加和自减 2.7.6 比较运算符 2.7.7 逻辑运算符 2.7.8 逗号运算符 2.7.9 空运算符 2.7.10 ?...:运算符 2.7.11 对象运算符 2.7.12 typeof运算符 2.7.13 运算符优先级 2.8 核心语句 2.8.1 基本处理流程 2.8.2 if... -
这些项目将涵盖医疗、自动驾驶、和自然语言处理等时髦领域,以及音乐生成等等。Coursera上有一些特定方向和知识的资料,但一直没有比较全面、深入浅出的深度学习课程——《深度学习专业》的推出补上了这一空缺。 ...
-
学生成绩信息管理系统论文 JSP 完整版
2009-03-17 16:24:31本论文叙述了现在高校学生成绩管理的现状以及JAVA语言和一些开源框架的概况。重点介绍了学生成绩管理系统的实现过程:包括系统分析、 系统调查、 数据库设计、功能设计、系统物理配置方案、 系统实现、系统测试以及... -
Microsoft .NET Framework 3.5 Service Pack 1
2017-10-08 00:43:38有关更多信息,请参见 What’s New in ASP.NET and Web Development(ASP.NET 和 Web 开发中的新增功能)。 对公共语言运行时的核心改进包括:改进了 .NET Framework 本机映像的布局、选择不再对完全受信任的程序集... -
iPhone开发秘籍(第2版)--源代码
2012-12-11 13:51:22原书名: The iPhone Developer's Cookbook: Building Applications with the iPhone 3.0 SDK (2nd Edition) 原出版社: Addison-Wesley Professional 作者: (美)Erica Sadun 译者: 张彩霞 高颖 易磊 丛书名: ... -
SAP屠夫作品汇总
2016-01-02 20:11:04如图8-[2],在payment transaction accountings页选上Clng with Cust.标志 189 Asset Accounting 197 折旧方法和折旧码 197 使用Substitution退还固定资产折旧某资产折旧的费用科目和折旧金额 204 FB08如何reverse... -
Training with 30G+ Raw Chinese Corpus, xxlarge, small version and more, Target to match State of the Art performance in Chinese with 30% less parameters, 2019-Oct-7, During the National Day of China!...
-
asp.net知识库
2015-06-18 08:45:45ASP.NET 2.0 Language Swithcer and Theme Swicher 多语言转换和多样式主题转换 ASP.NET2.0 ObjectDataSource的使用详解(1) ASP.NET2.0 ObjectDataSource的使用详解(2) TextDataSource(1) — ... -
pycorrector依据语言模型检测错别字位置,通过拼音音似特征、笔画五笔编辑距离特征及语言模型困惑度特征纠正错别字。 Question 中文文本纠错任务,常见错误类型包括: 谐音字词,如 配副眼睛-配副眼镜 混淆音字词...
-
Ukesoppgaver-网络编程-源码
-
x86-64框架下的寄存器
-
Glasterfs 分布式网络文件系统
-
C52-源码
-
等待线程池中线程执行完毕
-
vue3从0到1-超详细
-
PHP base64 编码转化图片并进行指定路径的保存和上传处理
-
access应用的3个开发实例
-
PHP——个人信息管理系统
-
了解SQLServer触发器及触发器中的事务
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
matlab判断数值或数组小数位数的函数
-
PPT大神之路高清教程
-
2021 年 Cnetos 7 下 nodejs 的安装
-
浅谈数据仓库建设中的数据建模方法
-
用户体验之网页板块设计
-
华为1+X——网络系统建设与运维(中级)
-
MySQL 高可用(DRBD + heartbeat)
-
同行评审常见问题解答
-
什么是区块链?这是我见过的最通俗易懂的解释