首页 > 其他分享 >golang 入门(十) 异常处理

golang 入门(十) 异常处理

时间:2023-02-20 12:36:51浏览次数:34  
标签:入门 fmt 程序 except ret golang 异常 运行

1、recovery捕获异常

代码在运行的时候,总会遇到错误。有的时候我们会希望程序遇到错误以后继续运行后面的流程,而不是直接异常退出。在Python中,使用try except组合实现这种需求,代码如下”

s = 0
try:
# 用5除以0,会造成计算结果异常
ret = 5/s
print("运行结果是 {}".format(ret))

except Exception as e:
print("我发现了异常 {}".format(e))

print("我还能继续运行到程序结束")

运行结果

% python main.py 
我发现了异常 division by zero
我还能继续运行到程序结束

Go中没有类似try except这种语法,我们使用内置函数recovery()来替代except捕获异常,要注意recovery()必须与延迟执行函数defer()一起使用。代码如下:

package main

import "fmt"

func calc(s int) {
// 定义一个延迟的匿名函数并运行
defer func() {
// 捕获异常,并赋值给变量。相当于python中except部分的功能
err := recover()
if err != nil {
fmt.Println("我发现了异常: ", err)
}
}()

ret := 5 / s
fmt.Println("运行结果是: ", ret)
}

func main() {

calc(0)

fmt.Println("我还能继续运行到程序结束")
}

运行结果

% go run main.go
我发现了异常: runtime error: integer divide by zero
我还能继续运行到程序结束


2、panic触发异常

除了系统判断出来的程序异常外,我们也会有需求可以自己主动抛出异常来终止程序或进行错误预警。在python中,我们通过raise关键字来实现这个需求,代码如下:

s = 5
try:
ret = int(5/s)
# 程序没错,我也可以自己触发异常
raise Exception("运行结果< {} >是正确的,但我就想抛个异常出来".format(ret))

except Exception as e:
print("我发现了异常: {}".format(e))

print("我还能继续运行到程序结束")

运行结果

% python main.py
我发现了异常 运行结果< 1 >是正确的,但我就想抛个异常出来
我还能继续运行到程序结束

在Go中,我们通过panic来实现类似的效果

package main

import "fmt"

func calc(s int) {
// 定义一个延迟执行的匿名函数
defer func() {
// 捕获异常,并赋值给变量。相当于python中except部分的功能
if err := recover(); err != nil {
fmt.Println("我发现了异常: ", err)
}
}()

ret := 5 / s
fmt.Println("运行结果是: ", ret)
// 主动抛出异常信息,会被recover()捕获到,相当于python中raise关键字的作用
panic("运行结果是正确的,但我就想抛个异常出来")
}

func main() {

calc(5)

fmt.Println("我还能继续运行到程序结束")
}

运行结果

% go run main.go
运行结果是: 1
我发现了异常: 运行结果是正确的,但我就想抛个异常出来
我还能继续运行到程序结束


标签:入门,fmt,程序,except,ret,golang,异常,运行
From: https://blog.51cto.com/830909/6068287

相关文章

  • Spring-Boot捕获处理异常并让事务回滚
    1.不捕获异常可以正常回滚@Transactional(rollbackFor=Exception.class)@OverridepublicbooleantestTransaction(){baseMapper.updateById(......
  • Golang基础-Runes
    rune与stringTherunetypeinGoisanaliasforint32.Giventhisunderlyingint32type,therunetypeholdsasigned32-bitintegervalue.However,unlikean......
  • golang 面向对象
    1.张老太养了两只猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名字......
  • 通信小白基础学习---MIMO技术入门,含码字,层映射,天线端口,预编码,PMI,rank,TM模式,波束赋形,空
    以下内容来源于B站up主“捻叶成剑”,如有侵权,请联系本人删除!载波聚合技术是增加带宽(拓宽车道),2*2MIMO是增加天线(增加车道为双车道)还有空分多址(实际应用不多)接收两......
  • 微信小程序:地图组件入门
    一、入门案例新建一个页面,在wxml文件中编写下面的代码<map/>效果如下:发现此时地点在北京。我们设置一下地图的宽和高<mapstyle="width:100%;height:600rpx;"/......
  • python系列 - 异常处理
    错误与异常通常来说,程序中的错误至少包含两种:一种是语法错误,另一种则是异常语法错误:代码不符合编程规范,无法被识别与执行异常:程序语法正确且可以被执行,但执行过程中遇到......
  • 线程的一些入门知识
    1.创建线程   A.继承Thread父类      重写run方法,在run方法中实现线程的任务            启动线程,调用start方法      B.实现接......
  • Filter_概述与Filter_快速入门
    Filter_概述 Filter:过滤器1.概念生活中的过滤器:净水器,空气净化器,土匪web的过滤器:当访问服务器的资源时,过滤器可以将请求拦......
  • opengauss节点异常无法启动-记录
    问题描述:Opengauss1主2备环境,反馈数据库连不上了查看原主一直在starting主备断了,新主只和omm3有链接后台不停拉起宕掉问题处理:手动停止omm1,并拉起,数据节点的日志......
  • 810~811 Filtter概述,快速入门
    Filtter:过滤器生活中的过滤器:净水器,土匪,空气净化器web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。过滤器的作用:......