Python中的异常处理raise介绍

2023-11-17

0. 介绍

问题1: 是否可以在程序的指定位置手动抛出一个异常

答案是肯定的,Python 允许我们在程序中手动设置异常,使用 raise 语句即可。

问题2: 我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢?

首先要分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用 raise 手动引发的异常(比如1÷0没有意义,程序没有写错,但是这样运算不合理,就是异常)。

raise 语句的基本语法格式为:

raise [exceptionName [(reason)]]

其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述

如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。

也就是说,raise 语句有如下三种常用的用法:

  • raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  • raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
  • raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。

代码测试

>>> raise
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零

1. raise 介绍(案例)

程序正常运行的时候,根据需要,用 raise 手动引发异常。

raise 语句引发的异常,通常用 try exceptelse finally)异常处理结构来捕获并进行处理。例如:

try:
    a = input("输入一个数:")
    #判断用户输入的是否为数字
    if(not a.isdigit()):
        raise ValueError("a 必须是数字")
except ValueError as e:
    print("引发异常:", repr(e))

当我们输入字母 a ,程序运行结果为:

runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test')
输入一个数:>? a
引发异常: ValueError('a 必须是数字')

当我们输入数字 8,程序运行结果为:

输入一个数:8

由上面示例可以看出,我们手动让程序引发异常,很多时候并不是为了让其崩溃。

2. raise 不需要参数(案例)

这里重点关注位于 except 块中的 raise

try:
    a = input("输入一个数:")
    if(not a.isdigit()):
        raise ValueError("a 必须是数字")
except ValueError as e:
    print("引发异常:", repr(e))
    raise

由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。当我们输入字母 a ,程序执行结果为:

In[2]: runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test')
输入一个数:a
引发异常: ValueError('a 必须是数字',)
Traceback (most recent call last):
  File "D:\python3.6\1.py", line 4, in <module>
    raise ValueError("a 必须是数字")
    
ValueError: a 必须是数字

这里重点关注位于 except 块中的 raise,由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。

3. raise:单独一个 raise(正常程序使用无参的 raise )

当在没有引发过异常的程序使用无参的 raise 语句时,它默认引发的是 RuntimeError 异常。例如:

try:
    a = input("输入一个数:")
    if(not a.isdigit()):
        raise
except RuntimeError as e:
    print("引发异常:", repr(e))

当我们输入字母 a ,程序执行结果为:

In[3]: runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test')
输入一个数:>? a
引发异常: RuntimeError('No active exception to reraise')

4. 其它案例

4.1 案例1

def read_file(file, pattern):
    try:
        if file.endswith('rtd'):
            data = pd.read_csv(file, skiprows=41, sep=r'\t')
        elif file.endswith('csv'):
            data = pd.read_csv(file)
        else:
            raise ValueError("Unknown file type")
        data = extract_cols(data, pattern=pattern, file=file)
    except Exception as e:
        print(f"{os.path.basename(file).split('.')[0]}: {e}")
        data = pd.DataFrame()
    return data

4.2 案例2

def divide(a, b):
    return a/b

try:
    divide(1, 0)
except:
    print("divide by 0")
else:
    print("the code is no problem")

print("code after try catch,hello,world!")

输出结果

divide by 0
code after try catch,hello,world!

5. 处理流程

try:
  code    #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序
 
except:  #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息
#except ExceptionName,args:    #同时也可以接受异常名称和参数,针对不同形式的异常做处理
 
  code  #这里执行异常处理的相关代码,打印输出等
 
else#如果没有异常则执行else
 
  code  #try部分被正常执行后执行的代码
 
finally:
  code  #退出try语句块总会执行的程序

可以看到

    1. 这里的 else 是和 try-catch 连用的,并且 else 只在 try 中代码没有异常的情况下执行,else 必须在 except 这句代码存在的时候才能出现。
    1. finally 这个片段里面的代码是肯定在最后执行的,无论前面是否发生异常,最后总会执行finally片段内的代码。
  • 所以,正常的流程是:try 没有发生错误-》else 内的代码-》finally 中的代码。

  • 发生异常的流程是:try 中发生异常-》被 except 捕获并执行 except 片段中的代码-》执行 finally 中的代码。

总结

也就是说,raise 语句有如下三种常用的用法:

1.raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
2.raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
3.raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。

参考链接:
链接1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中的异常处理raise介绍 的相关文章

随机推荐

  • dnf机械机器人补丁_史无前例!炉石一周内的第三个天梯平衡补丁来了

    大家应该还记得东少之前的一篇关于大铡蟹和鲁莽的实验者的文章吧 天胡的机械牧4费拍下伪装机器人 5费拍下鲁莽的实验者 然后直接无限buff斩杀对面 可惜大家将看不到这个强大可怕的无敌combo了 因为暴雪爸爸今天在官网论坛和Reddit都发表
  • 作好项目经理的12个要点

    1 了解项目管理的背景情况 成为一个成功的项目经理所面临的大部分困难来自于项目经理对公司内部各种挑战的理解和认识 项目是组织的一种特殊形式 它们作为一种机制 促进了一种产品和服务推向市场的效率 但是 它们还迫使项目经理在传统型 职能化的权利
  • 用C语言打印九九乘法表

    运用c语言的分支和循环的知识就可以打印出来9 9的乘法表 效果如图 具体代码 可以深刻理解循环和嵌套循环的应用 int main int i 0 行数 for i 1 i lt 9 i 行数 打印9行 int j 0 列数 for j 1
  • k8s scheduler 调度与 kubelet 启动 Pod 流程总结(四)

    文章目录 scheduler predicate 和 priority 资源需求 把 Pod 调度到指定 Node 上 nodeSelector 亲和性和反亲和性 节点亲和性 Pod 亲和性 污点和容忍度 Controller Manage
  • 【JavaEE初阶】第九节.多线程 (基础篇)定时器(案例三)

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 JavaEE初阶 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 前言 一 定时器概述 二 定时器的实现 2 1 Java标准库 定时器的使用 2 2 自己模拟实现一
  • 使用mysql数据库插入中文全部变成问号

    下午使用MYSQL数据库 插入中文时候全部变成为问号 找了一下午都没有找到合适的答案 有点小伤心 一个小问题耗费这么多时间 后面按照网上的方法改来改去 最后甚至连插入中文都报错 遇到这样的问题 首先先不要着急 肯定是编码的问题 先检查下我们
  • spark写表指定外部表_Spark SQL 之自定义删除外部表

    Spark SQL 之自定义删除外部表 前言 Spark SQL 在删除外部表时 本不能删除外部表的数据的 本篇文章主要介绍如何修改 Spark SQL 源码实现在删除外部表的时候 可以带额外选项来删除外部表的数据 本文的环境是我一直使用的
  • 《万字长文带你解读AIGC》系列之技术篇

    欢迎关注 CVHub 官方微信公众号 前景回顾 Welcome to back 在 万字长文带你解读AIGC入门篇 一文中 我们详细为大家介绍了AIGC的相关概念 背景及其如此火爆的原因 接下来我们将进一步深入探讨AIGC背后的技术栈 作为
  • 【论文党福利】如何提取图像中的数据

    论文党福利 如何提取图像中的数据 从事科研的老师和同学们在撰写论文时 经常需要将文献中的曲线与自己的结果进行对比 为获取原始数据 最靠谱的方法当然是找原作者要 如果没有要到呢 本文将成为论文党的福利 为你提供你两种解决方案 均是用matla
  • Vue2.0+webpack 引入字体文件(eot,ttf,woff)

    webpack base config js 需要配置 test woff2 eot ttf otf loader url loader options limit 10000 name utils assetsPath fonts nam
  • 图形学相关期刊和会议的基本信息

    目录 期刊 A类 ACM TOG A类 IEEE TIP A类 IEEE TVCG B类 TOMCCAP B类 CAGD B类 CGF B类 CAD B类 GM B类 TCSVT B类 TMM B类 SIIMS C类 CGTA C类 CAV
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)

    0x00 前言 使用各种的shell工具获取到目标权限 即可进行数据操作 今天来简要分析一下目前常使用的各类shell管理工具的流量特诊 帮助蓝队同学在风险识别上快速初值 0x01 中国菜刀流量分析 payload特征 PHP ASP AS
  • ElasticSearch系列-索引原理与数据读写流程详解

    索引原理 倒排索引 倒排索引 Inverted Index 也叫反向索引 有反向索引必有正向索引 通俗地来讲 正向索引是通过key找value 反向索引则是通过value找key ES底层在检索时底层使用的就是倒排索引 索引模型 现有索引和
  • JAVA(Object和String)一 Object类和String字符串的理解和使用

    JAVA Object和String 一 Object类和String字符串的理解和使用 Object类 String类 Object类 理解 在JAVA中有一个非常特殊的类叫做Object类 JAVA里面所有的类都继承自Object类 我
  • Git下载/查看/切换/新建分支

    1 git下载指定分支代码 git clone b branchname https github com xxx xxx git 2 看分支 git branch 列出本地已经存在的分支 并且当前分支会用 标记 git branch r
  • Element ui Dialog弹出框宽度固定不变

    一般我们引用Dialog弹出框时 弹出框的大小都是用width 30 这样来设置 这样的话我们在缩小屏幕的时候弹出框就会根据你缩小屏幕的宽度的百分比来设置 这样你弹出框里面的东西就会溢出 如果你不想溢出就把宽度写成width 500px 这
  • 文件上传服务器例子,服务器端的程序优化

    package cn dali4 code04ex 此程序优化了文件名 这样可以随机生成文件名 给服务器写了循环 可以一直监听 开启了多线程 优化了执行的效率 import java io import java net ServerSoc
  • C++代码注释详解

    常用注释语法 注释写在对应的函数或变量前面 JavaDoc类型的多行注释风格如下 这里为注释 一般注释中有简要注释和详细注释 简要注释有多种标识方式 这里推荐使用 brief命令强制说明 例如 brief 这里为简要注释 这里为详细注释 b
  • 正确使用g2o各类线性方程求解器

    g2o LinearSolverEigen g2o LinearSolverDense g2o LinearSolverCSparse g2o LinearSolverCholmod是常用的线性方程求解器 一套可运行程序 包括不同梯度下降优
  • Python中的异常处理raise介绍

    文章目录 0 介绍 1 raise 介绍 案例 2 raise 不需要参数 案例 3 raise 单独一个 raise 正常程序使用无参的 raise 4 其它案例 4 1 案例1 4 2 案例2 5 处理流程 总结 0 介绍 问题1 是否