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

假设我们不希望程序停止执行或向用户显示他们无法理解的输出。假设我们想打印一条有用且清晰的消息,那么我们需要使用 tryexcept 关键字来**处理**异常:

# 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. tryexcept
B. catchhandle
C. errorrescue
D. ifelse

使用一个异常块处理多个异常

你也可以像下面这样在一行中处理多个异常,而无需创建多个异常块。

# 在一个 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 的基类 Exceptionclass 来初始化,并使用 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. 从特殊模块导入它

相关链接