Python 教程 - 异常处理

Jinku Hu 2023年1月30日 2019年12月26日
  1. try...except
  2. raise 异常
  3. try...finally
  4. Python 内置异常
Python 教程 - 异常处理

你将在本节中学习如何处理 Python 异常。此外,你将学习引发和捕获异常。

当程序中发生异常时,程序执行将终止。但是大多数时候,你不希望程序异常终止,因此你可以使用 Python 异常处理来避免程序崩溃。

try...except

在下面的示例中,要求用户输入 10 个整数。如果用户输入其他类型而不是整数,则将引发异常并执行 except 中的语句:

>>> n = 10
>>> i = 1
>>> sum = 0
>>> while i <= n:
    try:
        num = int(input('Enter a number: '))
        sum = sum + num
        i = i+1
    except:
        print('Please enter an integer!!')
        break

    
Enter a number: 23
Enter a number: 12
Enter a number: Asd
Please enter an integer!!
>>> print('Sum of numbers =', sum)
Sum of numbers = 35

你还可以捕获指定的异常,例如,如果发生被零除的情况,则可以捕获对应的异常为:

try:
    #statements
except ZeroDivisionError:
    #exception handling
except:
    #all other exceptions are handled here

raise 异常

你可以使用 raise 关键字强制发生特定的异常:

>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError

>>> raise ValueError
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    raise ValueError
ValueError

如果需要向自举异常添加一些自定义信息,则可以将其添加到异常错误类型后的括号中。

>>> raise NameError("This is a customized exception")
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    raise NameError("This is a customized exception")
NameError: This is a customized exception

try...finally

finally 在异常处理 try 中是一个可选项。如果有一个 finally 块,无论结果如何,程序都会执行它。

在以下示例中我们对此进行演示:

>>> try:
        raise ValueError
finally:
        print('You are in finally block')

    
You are in finally block
Traceback (most recent call last):
  File "<pyshell#23>", line 2, in <module>
    raise ValueError
ValueError

try...finally 结构用于清理操作,例如在处理文件时,最好关闭文件。因此,文件将在 finally 块中关闭。

Python 内置异常

在本节中,你将学习 Python 编程中的标准异常。

异常是解释期间引发的运行时错误。例如,将任何数字除以零将产生一个称为 ZeroDivisionError 的运行时错误。

在 Python 中,下面描述了一些内置的异常:

异常 什么时候触发?
AssertionError assert 语句失败
AttributeError attribute 引用失败时
EOFError input() 函数未读取任何数据并到达文件末尾时
FloatingPointError 当浮点计算失败时
GeneratorExit 当协程或生成器关闭时,GeneratorExit 发生异常
ImportError import 找不到模块时
ModuleNotFoundError import 找不到模块时。此异常是 ImportError 的子类
IndexError 当序列的索引不在范围内时
KeyError 当在字典中找不到字典键时
KeyboardInterrupt 当按下中断键时
MemoryError 当指定操作的内存量较少时
NameError 当找不到变量时
NotImplementedError 需要但不提供抽象方法的实现时
OSError 遇到系统错误时
OverFlowError 当值太大而无法表示时
RecursionError 当递归限制超过最大数量时
IndentationError 为任何函数,类等的定义正确指定缩进时
SystemError 当发现与系统相关的错误时
SystemExit sys.exit() 用于退出解释器时
TypeError 当操作对于指定的数据类型无效时
ValueError 当内置函数具有有效的自变量但提供的值无效时
RunTimeError 当生成的错误不在其他类别中时
IOError I/O 操作失败时
UnBoundLocalError 当访问局部变量但没有值时
SyntaxError 当有语法错误时
TabError 当有不必要的制表符缩进时
UnicodeError 当遇到 Unicode 相关错误时
UnicodeEncodeError 由于编码遇到 Unicode 相关错误时
UnicodeDecodeError 由于解码遇到 Unicode 相关错误时
UnicodeTranslateError 由于翻译而遇到 Unicode 相关错误时
ZeroDivisionError 当数字除以零时
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn