在前面章节的学习中,遗留过一个问题,即是否可以在程序的指定位置手动抛出一个异常?答案是肯定的,Python 允许我们在程序中手动设置异常,使用 raise 语句即可。

读者可能会感到疑惑,即我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢?首先要分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用 raise 手动引发的异常。

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

raise [exceptionName [(reason)]]

其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。

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

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

想了解一下常用的异常类名称,可以阅读《Python常见异常类型》一节。

显然,每次执行 raise 语句,都只能引发一次执行的异常。首先,我们来测试一下以上 3 种 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: 除数不能为零

当然,我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise 语句引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。例如:

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

程序运行结果为:

输入一个数:a
引发异常: ValueError('a 必须是数字',)

可以看到,当用户输入的不是数字时,程序会进入 if 判断语句,并执行 raise 引发 ValueError 异常。但由于其位于 try 块中,因为 raise 抛出的异常会被 try 捕获,并由 except 块进行处理。

因此,虽然程序中使用了 raise 语句引发异常,但程序的执行是正常的,手动抛出的异常并不会导致程序崩溃。

raise 不需要参数

正如前面所看到的,在使用 raise 语句时可以不带参数,例如:

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

程序执行结果为:

输入一个数: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 语句时,它会再次引发一次。

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

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

程序执行结果为:

输入一个数:a
引发异常: RuntimeError('No active exception to reraise',)

Python raise用法相关推荐

  1. Python raise用法(超级详细,看了无师自通)

    当程序出现错误时,系统会自动引发异常.除此之外,Python 也允许程序自行引发异常,自行引发异常使用 raise 语句来完成. 异常是一种很"主观"的说法,以下雨为例,假设大家约 ...

  2. Python raise用法(超级详细,无师自通)

    问题: 是否可以在程序的指定位置手动抛出一个异常?答案是肯定的,Python 允许我们在程序中手动设置异常,使用 raise 语句即可. 你们可能会感到疑惑,即我们从来都是想方设法地让程序正常运行,为 ...

  3. Python raise用法(详细讲解)

    在写代码的过程中,我们是否有这样一个疑问?即是否可以在程序的指定位置手动抛出一个异常?答案是肯定的,Python 允许我们在程序中手动设置异常,使用 raise 语句即可. 可能大家会感到疑惑,即我们 ...

  4. Python的raise用法

     学习笔记 1.什么是异常处理 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback, ...

  5. python raise exception用法_python Exception raise

    异常是指程序中的例外,违例情况.异常机制是指程序出现错误后,程序的处理方法.当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理. Exception类是常用的异常类,该类包括Standa ...

  6. python with用法

    @python with用法 python中with可以明显改进代码友好度,比如: [python] view plaincopyprint? with open('a.txt') as f: pri ...

  7. python raise

    当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法 a = 0 #30if a > 1 ...

  8. python raise用处_python基础教程python raise的基本使用

    简介 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 1.演示raise用法 try: s = None i ...

  9. python raise的基本使用

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接:好看站 http://www.nrso.net/ 高州阳光论坛https://www.hnthzk.com/ 简 ...

最新文章

  1. Activity的LaunchMode
  2. Asp.net,C# 加密解密字符串
  3. 网站apache环境S2-057漏洞 利用POC 远程执行命令漏洞复现
  4. 【FLASH BUILDER 4.6 快捷键】只记几个对自己有帮助的
  5. Python之迭代器
  6. jQuery可放大预览的图片滑块
  7. ui unity 图片高亮_程序化生成UI模型与顶点动画
  8. php sorcket_PHP: Sockets - Manual
  9. 小甲鱼 OllyDbg 教程系列 (十五) : 逆向注册机简单算法
  10. mac 切换鼠标滚轮方向
  11. 开发者如何谈判才能获得更高的薪水?
  12. #linux包之sysstat之iostat命令
  13. SAP软件财务年结步骤
  14. TIF转PDF--itextpdf
  15. 每日技巧分享:怎么裁剪音频,快学习起来
  16. Unity TimeLine实用功能讲解
  17. 【论文速递】-2022-金融研究-系统性金融风险文献综述:现状、发展与展望
  18. 登录onedrive显示无法连接服务器,Win10专业版系统下OneDrive无法登录提示连接到OneDrive时出现问题怎么办...
  19. html文件右键没有打开方式,一个文件打不开,点右键,怎么在打开方式中加入Word,Excel的打开方式,打开方式中有Word的打开方式?...
  20. 2021-03-15我的博客

热门文章

  1. 最远点采样(Farthest Point Sampling,FPS)算法详解
  2. 【Tensorflow入门教程一】纵观全局:tensorflow各函数块解析。
  3. 1990-2019年银行存款准备金率
  4. 干货自助时代,带你玩转Big Data:SDCC 2017·深圳站大数据专场一轮预告上线
  5. k3wise域服务器登录证书,K3WISE疑难杂症问题解析(七)
  6. 自己做量化交易软件(17)通过基本面建立自己的股票池
  7. 为什么内存进制是1024,数据传输速率是1000?
  8. 招银一面:如何保障 MySQL 和 Redis 的数据一致性?
  9. 微软的官方升级网站系统--Windows update
  10. 操作csv格式文件之csv.reader()方法