Python 异常处理
在计算和计算机编程中,异常处理是响应异常——需要特殊处理的反常或例外情况——的过程。
Python 有许多内置异常,当程序遇到错误时会引发这些异常,并且大多数外部库,如流行的 Requests,都包含其自定义异常,我们需要进行处理。
基本异常处理
你不能除以零,这是一个数学真理,如果你在 Python 中尝试这样做,解释器将引发内置异常 ZeroDivisionError:
def divide(dividend , divisor):
print(dividend / divisor)
divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
假设我们不希望程序停止执行或向用户显示他们无法理解的输出。假设我们想打印一条有用且清晰的消息,那么我们需要使用 try 和 except 关键字来**处理**异常:
# try-except: 优雅地处理异常
def divide(dividend , divisor):
try: # 尝试执行此代码
print(dividend / divisor)
except ZeroDivisionError: # 捕获特定异常类型
print('你不能除以 0')
divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
你不能除以 0
测验
登录后即可答题并追踪学习进度
在 Python 中,使用哪些关键字来处理异常?
A.
try 和 exceptB.
catch 和 handleC.
error 和 rescueD.
if 和 else使用一个异常块处理多个异常
你也可以像下面这样在一行中处理多个异常,而无需创建多个异常块。
# 在一个 except 块中处理多个异常
def divide(dividend , divisor):
try:
if (dividend == 10):
var = 'str' + 1 # 这将引发 TypeError
else:
print(dividend / divisor)
except (ZeroDivisionError, TypeError) as error: # 捕获多种异常类型
print(error) # 打印错误消息
divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
测验
登录后即可答题并追踪学习进度
可以在单个
except 块中处理多种异常类型吗?A. 不行,必须为每种异常类型使用单独的
except 块B. 可以,通过将它们放在一个元组中,如
except (Exception1, Exception2)C. 可以,但仅当它们相关时
D. 不行,Python 不支持此功能
异常处理中的 Finally 代码
无论是否引发异常,finally 部分中的代码始终会被执行:
# finally 块:无论是否发生异常,都会执行
def divide(dividend , divisor):
try:
print(dividend / divisor)
except ZeroDivisionError:
print('你不能除以 0')
finally: # 无论是否发生异常,都始终执行
print('执行完毕')
divide(dividend=10, divisor=5)
2.0
执行完毕
divide(dividend=10, divisor=0)
你不能除以 0
执行完毕
测验
登录后即可答题并追踪学习进度
finally 块何时执行?A. 仅在发生异常时
B. 仅在未发生异常时
C. 始终执行,无论是否发生异常
D. 从不执行
自定义异常
自定义异常通过创建继承自 Python 的基类 Exception 的 class 来初始化,并使用 raise 关键字引发:
# 自定义异常:通过继承 Exception 类创建
class MyCustomException(Exception):
pass
raise MyCustomException # 引发自定义异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.MyCustomException
要声明自定义异常消息,可以将其作为参数传递:
class MyCustomException(Exception):
pass
raise MyCustomException('A custom message for my custom exception')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
__main__.MyCustomException: A custom message for my custom exception
处理自定义异常与处理任何其他异常相同:
try:
raise MyCustomException('A custom message for my custom exception')
except MyCustomException:
print('My custom exception was raised')
My custom exception was raised
测验
登录后即可答题并追踪学习进度
如何在 Python 中创建自定义异常?
A. 创建一个继承自
Exception 类的类B. 使用
@exception 装饰器C. 调用
Exception.create()D. 从特殊模块导入它