Go错误处理之panic函数和recover函数使用及捕获异常方法
作者:雨雨不怕雨 发布时间:2024-02-13 02:16:12
标签:go,异常,panic,recover
前言
前面我们讲过了error类型来处理一般的错误,本文会描述使用panic函数和recover函数来处理比较极端的错误。简单来说,当程序运行时遇到无法处理的错误或异常情况时,会调用panic
函数引发一个运行时错误,此时程序会终止执行并抛出错误信息。为了避免程序崩溃,可以使用recover
函数来捕获错误,并进行处理或恢复程序的执行,通常recover
函数写在defer
语句中。
panic函数
panic函数是内置的一个函数,他的结构如下:
func panic(v interface{})
此函数接受一个接口类型的值,这个值通常是错误的描述,调用次函数后,会引发异常,这将中止当前的程序流程,并在堆栈中记录当前的异常信息。此函数可以被主动调用,也可以在发生数组越界、空指针引用等情况下被动调用。
我们将上篇文章的除法例子进行小小的修改,使用panic进行错误处理:
package main
import (
"fmt"
)
func divide(a, b int) int{
if b == 0 {
panic("division by zero")
}
return a / b
}
func main() {
result := divide(10, 0)
fmt.Println("the result is ",result)
}
运行后,程序直接退出了,报division by zero
错误。
recover函数
有些时候,我们不希望panic函数直接粗暴的退出,这时候我们可以使用recover函数对pannic进行捕获,注意,recover函数只能写在defer关键字之后哦!
recover也是内置函数,他的结构如下:
func recover() interface{}
他能捕获到的panic函数报出的错误,并使用接口类型进行返回。
我们使用recover对例子再次修改,让程序可以继续的运行,而不是粗暴的退出,代码如下:
package main
import (
"fmt"
)
func divide(a, b int) int{
defer func() {
if err:=recover();err!=nil {
fmt.Printf("runtime panic : %v\n", err)
}
}()
if b == 0 {
panic("division by zero")
}
return a / b
}
func main() {
result := divide(10, 0)
fmt.Println("the result is ",result)
}
来源:https://blog.csdn.net/doreen211/article/details/129735009


猜你喜欢
- 首先检查MySQL 服务没有启动》如果没有启动,则要启动这个服务。有时候安装mysql后使用mysql命令时报错 Can'
- <?php /*============================文件说明===========================
- 本文默认你的开发环境.数据库已经安装好想用使用数据库.我们需要现在pom文件中添加相应的依赖pom.xml<?xml version=
- 直接看代码using System;using System.Configuration;using MySql.Data.MySqlCli
- 在使用Celery统计每日访问数量的时候,发现一个任务会同时执行两次,发现同一时间内(1s内)竟然同时发送了两次任务,也就是同时产生了两个w
- 根据菜鸟教程Django教程学习,运行"python manage.py migrate" 报错,出现django.db
- by cpglkg <script>var arr=[5,10,15];function rect(arr,width){&nb
- 目录简介图形加载和说明图形的灰度灰度图像的压缩原始图像的压缩总结简介本文将会以图表的形式为大家讲解怎么在NumPy中进行多维数据的线性代数运
- 目录前言一、数组遍历方法1. forEach()2. map()3. for of4. filter()5. some()、every()6
- 之前没有注意过div的background-image这个属性,只是设置它的url,今天遇到一个问题特此做一下记录。 <div id=
- 本文实例讲述了JS前端加密算法。分享给大家供大家参考,具体如下:解密操作对服务器性能颇有消耗。寻思着能不能在前端完成。于是找到了crypto
- Go语言中rune方法如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希
- 垃圾评论,垃圾留言,人见人憎,用了验证码,效果也好不到哪里去,还影响用户体验。有的网站甚至不惜牺牲用户体验,而构造强悍的惨不忍睹的超级验证码
- 我们经常会在登录一个网站的时候被引导页挡住前进的脚步,这一点在上个世纪到本世纪初的网站中尤其明显,特别是在企业网站里,几乎每个企业网站都会有
- 分页应该是在我们开发web应用时经常要做的工作,能够比较简洁的实现数据库和视图层的分页十分重要。在数据库层利用hibernate进行数据库的
- 网络开发的在分页上要是遇到数(几十)万以上的数据还是用ADO那样的分页会速度很慢的。有了存储过程速度就快多了。下面是本人用50万的数据进行的
- 一、功能这里的需求是,判断摄像头有没有被物体遮挡。这里只考虑用手遮挡---->判断黑色颜色的范围。二、使用OpenCV的Mat格式图片
- 引言只进行基本的四则运算,利用栈结构和后缀表达式来计算数学表达式的值。本文代码:GitHub 运行效果:问题如果只能进行两个值的加
- 前言上篇介绍了go-grpc-middleware的grpc_zap、grpc_auth和grpc_recovery使用,本篇将介绍grpc
- Crawler全名是DomCrawler,是Symfony框架的组件。令人发指的是DomCrawler的没有中文文档,Symfony也没有翻