Python基础教程 学习笔记 第八章 异常

本文深入探讨Python中的异常处理机制,包括异常的引发、捕获、重新引发及与函数的关系。同时,介绍了如何使用warnings模块来处理警告信息,以及异常处理的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述## 一,什么是异常
Python使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误消息(traceback)。

二,引发异常

raise

使用 raise 语句,并将一个类(必须是 Exception 的子类)或实例作为参数。

>>> raise Exception
Traceback (most recent call last):
	File "<stdin>", line 1, in ?
Exception
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
	File "<stdin>", line 1, in ?
Exception: hyperdrive overload

raise Exception——引发通用异常
raise Exception(‘错误信息’) ——添加了错误信息

内置异常类(部分)
类 名描 述
Exception几乎所有的异常类都是从它派生而来的
AttributeError引用属性或给它赋值失败时引发
OSError操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
IndexError使用序列中不存在的索引时引发,为 LookupError 的子类
KeyError使用映射中不存在的键时引发,为 LookupError 的子类
NameError找不到名称(变量)时引发
SyntaxError代码不正确时引发
TypeError将内置操作或函数用于类型不正确的对象时引发
ValueError将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
ZeroDivisionError在除法或求模运算的第二个参数为零时引发
自定义异常类

只要是Exception的子类就行

class SomeCustomException(Exception): pass

三,捕获异常

3.1 try/except/else/finally语句
try:
	...
except 异常类1:
	...
except 异常类2:
	...
except(异常类3,异常类4,异常类5):
	...
except(异常类6,异常类7) as 储存异常类的变量e:
	...      #可用该变量e访问该异常类
except:      #捕获所有异常
	...
else:        #没有捕获到异常是
	...	
finally:	 #最后执行清理工作,总会运行
	...

注意

异常从函数向外传播到调用函数的地方。如果在这里也没有被捕获,异常将向程序的最顶层传播。这意味着你可使用 try / except 来捕获他人所编写函数引发的异常。


3.2重新引发

捕获异常后,如果要重新引发它(即继续向上传播),可调用 raise 且不提供任何参数


注意

发生除零行为时,如果启用了“抑制”功能,方法将(隐式地)返回 None 。换而言之,如果启用了“抑制”功能,就不应依赖返回值。


若在处理异常时想引发其他异常,在except语句raise该异常,但原本的异常将会被作为异常上下文存储起来,并出现在最终的错误消息中。

>>> try:
... 	1/0
... except ZeroDivisionError:
... 	raise ValueError
...
Traceback (most recent call last):
	File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
Traceback (most recent call last):
	File "<stdin>", line 4, in <module>
ValueError

可使用 raise … from … 语句来提供自己的异常上下文,也可使用 None 来禁用上下文。这样只提供raise与from之间的异常消息。

>>> try:
... 1/0
... except ZeroDivisionError:
... raise ValueError from None
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueErro

四,异常和函数

异常和函数有着天然的联系。如果不处理函数中引发的异常,它将向上传播到调用函数的地方。如果在那里也未得到处理,异常将继续传播,直至到达主程序(全局作用域)。如果主程序中也没有异常处理程序,程序将终止并显示栈跟踪消息。

五,异常之禅

六,警告

发出警告,指出情况偏离了正轨,可使用模块 warnings 中的函数 warn 。

同一警告只显示一次。

>>> from warnings import warn
>>> warn('There is a waning')

Warning (from warnings module):
  File "__main__", line 1
UserWarning: There is a waning
>>> warn('There is a waning')
>>> warn('There is another warning')

Warning (from warnings module):
  File "__main__", line 1
UserWarning: There is another warning
>>> 

可用warnings模块中的函数filterwarnings来抑制警告,并指定要采取的措施,如“error”或“ignore”。
即引发异常或忽略。

引发的异常为UserWarnings:警告类

>>> from warnings import filterwarnings
>>> filterwarnings("ignore")
>>> warn("Anyone out there?")
>>> filterwarnings("error")
>>> warn("Something is very wrong!")
Traceback (most recent call last):
	File "<stdin>", line 1, in <module>
UserWarning: Something is very wrong!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值