关于python中try。。。except的用法小结

news/2024/10/30 9:22:10/

关于python中try。。。except的用法小结

如果except子句中的类是同一类或其基类,则该子句与异常兼容(但不是相反的方式-列出派生类的except子句与基类不兼容)。例如,以下代码将按此顺序打印B,C,D:

>>> class C(B):pass>>> class D(C):pass>>> for cls in [B,C,D]:try:raise cls()except D:print("D")except C:print("C")except B:print("B")B
C
D

发生异常时,它可能具有关联的值,也称为异常的参数。参数的存在和类型取决于异常类型。

except子句可以在异常名称后指定一个变量。变量绑定到带有存储在中的参数的异常实例 instance.args。为了方便起见,定义了异常实例, str()以便可以直接打印自变量而无需引用.args。人们也可以在引发异常之前先实例化异常,然后根据需要向其添加任何属性。

>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print(type(inst))    # the exception instance
...     print(inst.args)     # arguments stored in .args
...     print(inst)          # __str__ allows args to be printed directly,
...                          # but may be overridden in exception subclasses
...     x, y = inst.args     # unpack args
...     print('x =', x)
...     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

如果异常处理程序立即在try子句中发生,则异常处理程序不仅会处理异常,而且如果它们在try子句中被调用(甚至间接调用)的函数中发生,异常处理程序也不会处理异常。例如:

>>> def this_fails():x = 1/0>>> try:this_fails()except ZeroDivisionError as err:print('Handling run-time error:',err)Handling run-time error: division by zero

抛出异常

>>> raise NameError('HiThere')
Traceback (most recent call last):File "<pyshell#66>", line 1, in <module>raise NameError('HiThere')
NameError: HiThere
>>> raise ValueError
Traceback (most recent call last):File "<pyshell#67>", line 1, in <module>raise ValueError
ValueError
>>> try:raise NameError('HiThere!')
except NameError:print('An exception flew by!')An exception flew by!

如果您需要确定是否引发了异常,但又不想处理该异常,则可以使用一种更简单的raise语句形式来重新引发该异常:

>>> try:raise NameError('HiThere!')
except NameError:print('An exception flew by!')raiseAn exception flew by!
Traceback (most recent call last):File "<pyshell#75>", line 2, in <module>raise NameError('HiThere!')
NameError: HiThere!

try语句还有另一个可选子句,用于定义必须在所有情况下都必须执行的清理操作。

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):File "<stdin>", line 2, in <module>

如果该try子句中发生了异常且尚未由except子句处理 (或在exceptor else子句中发生),则finally在执行该子句后将重新引发该异常。
finally当try通过break,continue或return语句留下语句的 任何其他子句时,该子句也“跳出时”执行。

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

预定义的清理动作

with open("myfile.txt") as f:for line in f:print(line, end="")

执行该语句后,即使处理行时遇到问题,文件f也始终关闭。像文件一样提供预定义清除操作的对象将在其文档中进行说明。

①https://docs.python.org/3.6/tutorial/errors.html?highlight=exceptions
②https://docs.python.org/3.6/reference/compound_stmts.html#except
③https://docs.python.org/3.6/library/exceptions.html
④https://docs.python.org/3.6/reference/simple_stmts.html#raise


http://www.ppmy.cn/news/40753.html

相关文章

算法套路九——二叉树广度优先遍历(层序遍历)

算法套路九——二叉树广度优先遍历&#xff08;层序遍历&#xff09; 算法示例LeetCode102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 法一&#xff1a;双数组…

ROS学习——艰辛的环境安装之路一VMware

文章目录VMware 安装下载安装VMware 安装 一些没用的介绍&#xff1a; VMware Workstation中文版是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一…

3.1 微分中值定理

思维导图&#xff1a; 学习目标&#xff1a; 我会按照以下步骤来学习微分中值定理&#xff1a; 理解导数的定义和性质&#xff1a;在学习微分中值定理之前&#xff0c;首先要对导数的定义和性质有一个清晰的理解&#xff0c;包括导数的几何意义和导数存在的条件等。学习拉格朗…

课前测2-丑数

目录 课前测2-丑数 程序设计 程序分析 课前测2-丑数 【问题描述】 丑数的定义是这样的—— 一个数,如果它分解后的素因子最多只有2、3、5、7四种,这个数则称为“丑数”。比如,前20个丑数是:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 2…

Windows误删文件恢复,看这里,4个数据恢复方法!

案例&#xff1a;Windows误删文件怎么恢复&#xff1f; 【芭比Q了姐妹们&#xff0c;我在使用电脑时一不小心误删了一个特别重要的文件&#xff0c;我的电脑是Windows版本的&#xff0c;有哪位电脑大神可以给我出出主意吗&#xff1f;跪谢大家&#xff01;】 在使用Windows操…

Java模拟rank() over()函数获取分组排名的方法设计及实现

背景 考试批次班级姓名语文202302三年一班张小明130.00202302三年一班王二小128.00202302三年一班谢春花136.00202302三年二班冯世杰129.00202302三年二班马功成130.00202302三年二班魏翩翩136.00 假设我们有如上数据&#xff0c;现在有一个需求需要统计各学生语文单科成绩在班…

如何避免 MyBatis 查询导致的内存溢出:配置与策略指南

前言 在处理大型数据库查询时&#xff0c;内存溢出是一个常见的问题。如果不加以控制&#xff0c;一次性加载大量数据到内存中可能会导致程序崩溃。本文将介绍如何在 MyBatis 中通过各种配置和操作来有效避免查询导致的内存溢出。我们将讨论设置 defaultFetchSize、分页查询、…

如何给ClickHouse表生成随机真实测试数据

学习ClickHouse数据库&#xff0c;通常需要下载官网一些示例数据。我们也可以通过内置函数generateRandom快速生成测试数据&#xff0c;从而测试学习一些特性的性能及底层原理。 函数语法 generateRandom函数基于给定schema生成随机数据&#xff0c;用于填充测试表。不是所有类…