在前面章节的学习中,遗留过一个问题,即是否可以在程序的指定位置手动抛出一个异常?答案是肯定的,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. bash: ifconfig: command not found
  2. 自动唤醒解锁电脑 bat_吉行贴士 | 一键解锁智能语音新姿势
  3. EasyUI 1.3.6 行号显示不全
  4. JDK8 指南(译)
  5. figma下载_切换到Figma并在其中工作不必是火箭科学,这就是为什么
  6. 干货|亲测有效的N倍学习效果笔记法
  7. python查找文件内容_python实现搜索文本文件内容脚本
  8. 简述python常用的函数模块_Python学习笔记(十三)—函数常用模块
  9. Kali Linux 秘籍 第五章 漏洞评估
  10. 使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据...
  11. 廖雪峰java教程 pdf_廖雪峰java学习笔记.pdf
  12. 9、杂项:qxdm报错0xc000007b无法启动
  13. matplotlib画正态分布图
  14. 专升本第九讲 (WORD+PPT)
  15. userdel删除用户时候提示:userdel: user xx is currently logged in
  16. android修改MTP及MTP(PC显示名称)、PTP盘符名、蓝牙名称
  17. 加州大学伯克利分校是如何培养计算机学生的
  18. tensorflow目标检测API实现
  19. Telegram电报:设置中文的方法
  20. 前端基础CSS3-(3D动画)

热门文章

  1. 终于把Linux中的access搞懂了 (内附C语言测试代码)
  2. 使用Konva操纵HTML5画布:第3部分,复杂的形状和精灵
  3. labview基于一维数组的二维曲线绘制
  4. python中用matplotlib画多幅图时出现图形部分重叠的解决方案
  5. KY95 Old Bill
  6. Gilde的简单使用
  7. 域名服务器虚拟主机购买,如何注册网站域名和购买虚拟主机
  8. 第二章 我国农业经济发展战略
  9. Python + Selenium: 使用webdriver判断浏览器是否关闭
  10. Js中String对象方法replace()用法详解