Python中的异常处理

2025年4月21日 | 阅读 9 分钟

当 Python 程序遇到错误时,它会停止执行程序的其余部分。Python 中的错误可能是表达式语法中的错误,也可能是 Python 异常。我们将了解什么是异常。此外,在本教程中,我们将探讨语法错误和异常之间的区别。在此之后,我们将学习 try 和 except 块,以及如何引发异常和进行断言。然后,我们将查看 Python 异常列表。

什么是异常?

Python 中的异常是在程序执行期间发生的事件,它会中断程序命令的正常流程。当 Python 代码遇到无法处理的情况时,它会引发异常。Python 中描述错误的“对象”称为异常。

当 Python 代码引发异常时,它有两种选择:立即处理异常或停止并退出。

异常与语法错误

当解释器识别出有错误的语句时,就会发生语法错误。请考虑以下场景:

代码

输出

    if (s != o:
              ^
SyntaxError: invalid syntax

输出中的箭头显示了解释器遇到语法错误的位置。在这种情况下,有一个未闭合的括号。请闭合它并重新运行程序。

代码

输出

      2 string = "Python Exceptions"
      4 for s in string:
----> 5     if (s != o):
      6         print( s )

NameError: name 'o' is not defined

执行此代码后,我们遇到了异常错误。当语法正确的 Python 代码产生错误时,就会出现这种类型的错误。输出的最后一行指定了遇到的异常错误代码的名称。Python 不仅显示“异常错误”,而是显示有关发生的异常错误的类型的详细信息。在这种情况下,它是 NameError。Python 包含许多内置异常。然而,Python 提供了创建自定义异常的功能。

Try 和 Except 语句 - 捕获异常

在 Python 中,我们使用 try 和 except 代码块来捕获和处理异常。try 子句包含可能引发异常的代码,而 except 子句包含处理异常的代码行。让我们看看是否可以访问数组的索引,该索引大于数组的长度,并处理由此产生的异常。

代码

输出

The index and element from the array is 0 Python
The index and element from the array is 1 Exceptions
The index and element from the array is 2 try and except
Index out of range

在前面的示例中,可能产生错误的代码块被插入到 try 子句中。i 大于 2 的值尝试访问列表中不存在的、超出其长度的项,从而导致异常。然后 except 子句捕获此异常并执行代码,而不会停止程序。

如何引发异常

如果一个条件不满足我们的标准,但根据 Python 解释器来说是正确的,我们可以使用 raise 关键字故意引发异常。我们可以结合使用自定义异常和该语句。

如果我们希望在给定条件发生时使用 raise 来生成异常,我们可以这样做:

代码

输出

      1 num = [3, 4, 5, 7]
      2 if len(num) > 3:
----> 3     raise Exception( f"Length of the given list must be less than or equal to 3 but is {len(num)}" )

Exception: Length of the given list must be less than or equal to 3 but is 4

实现停止并显示我们的异常,提供有关何处出错的指示。

Python 中的断言

当我们完成程序验证时,断言是一种一致性测试,我们可以将其打开或关闭。

理解断言最简单的方法是将其与 if-then 条件进行比较。当一个表达式的计算结果为 False 时,会抛出异常。

断言通过 assert 语句进行,该语句在 Python 1.5 中作为最新关键字添加。

断言通常在函数开头用于检查有效输入,在调用函数结束时用于检查有效输出。

assert 语句

Python 在找到 assert 语句时会检查相邻的表达式,最好是 True。如果表达式的结果为 False,Python 会引发 AssertionError 异常。

assert 子句的语法是:

如果断言失败,Python 会将 AssertionError 的参数用作 ArgumentException。我们可以使用 try-except 子句来捕获和处理 AssertionError 异常,但如果它们不存在,程序将停止,Python 解释器将生成一个回溯。

代码

输出

      7 #Calling function and passing the values
----> 8 print( square_root( 36 ) )
      9 print( square_root( -36 ) )

Input In [23], in square_root(Number)
      3 def square_root( Number ):
----> 4     assert ( Number < 0), "Give a positive integer"
      5     return Number**(1/2)

AssertionError: Give a positive integer

Try 配合 Else 子句

Python 还支持 else 子句,它应该出现在每个 except 子句之后,在 try 和 except 块中。仅当 try 子句未能引发异常时,Python 解释器才会继续执行 else 块。

下面是一个带有 else 子句的 try 子句的示例。

代码

输出

0.25
We cannot divide by zero

Python中的Finally关键字

Python 提供了 finally 关键字,它始终在 try-except 块之后使用。无论 try 块正常终止还是因其他原因终止,finally 代码块始终会被执行。

下面是 finally 关键字与 try-except 子句的示例:

代码

输出

Atepting to divide by zero
This is code of finally clause

用户定义的异常

通过继承标准内置异常的类,Python 还允许我们设计自定义异常。

下面是 RuntimeError 的一个示例。在这种情况下,会创建一个派生自 RuntimeError 的类。一旦检测到异常,我们就可以使用它来显示更详细的信息。

我们在 try 块中引发用户定义的异常,然后在 except 块中处理该异常。使用变量 var 创建了一个 EmptyError 类的示例。

代码

输出

      2 try:
----> 3     raise EmptyError( "The variable is empty" )
      4 except (EmptyError, var):

EmptyError: The variable is empty

Python 异常列表

以下是 Python 内置异常的完整列表。

序号异常名称异常描述
1ExceptionPython 的所有异常都有一个基类。
2StopIteration如果 next() 方法为迭代器返回 null,则会引发此异常。
3SystemExitsys.exit() 过程会引发此值。
4StandardError除 StopIteration 和 SystemExit 外,这是所有 Python 内置异常的基类。
5ArithmeticError所有数学计算错误都属于这个基类。
6OverflowError当计算超出数值数据类型的最大限制时,会引发此异常。
7FloatingPointError如果浮点运算失败,则会引发此异常。
8ZeroDivisionError对于所有数值数据类型,当尝试将数字除以零时,会引发其值。
9AssertionError如果 Assert 语句失败,则会引发此异常。
10AttributeError如果变量引用或赋值失败,则会引发此异常。
11EOFError当到达文件末尾,并且解释器没有通过 raw_input() 或 input() 函数获取任何输入值时,会引发此异常。
12ImportError如果使用 import 关键字导入模块失败,则会引发此异常。
13KeyboardInterrupt如果用户中断了程序的执行,通常是通过按 Ctrl+C,则会引发此异常。
14LookupErrorLookupErrorBase 是所有查找错误的基类。
15IndexError尝试访问的索引未找到时,会引发此异常。
16KeyError当在字典中找不到要查找的给定键时,会引发此异常。
17NameError当变量在局部或全局命名空间中都找不到时,会引发此异常。
18UnboundLocalError当我们在函数中尝试访问一个局部变量,但该变量尚未被赋值时,会引发此异常。
19EnvironmentError所有超出 Python 环境的异常都属于这个基类。
20IOError如果输入或输出操作失败,例如在使用 print 命令或 open() 函数访问不存在的文件时,则会引发此异常。
22SyntaxError当我们的程序中发生语法错误时,会引发此异常。
23IndentationError当我们进行了不正确的缩进时,会引发此异常。
24SystemExit当使用 sys.exit() 方法终止 Python 解释器时,会引发此异常。如果代码中未处理该情况,则解析器将退出。
25TypeError当尝试执行数据类型不兼容的操作或函数时,会引发此异常。
26ValueError当为特定数据类型的内置方法提供的参数类型正确但值错误时,会引发此异常。
27RuntimeError当程序执行期间发生的错误无法归类时,会引发此异常。
28NotImplementedError如果继承类中必须由用户定义的抽象函数未被定义,则会引发此异常。

总结

在学习了语法错误和异常的区别之后,我们学习了引发、捕获和处理 Python 异常的各种方法。在本教程中,我们学习了这些子句:

  • 我们可以使用 raise 关键字在任何代码行引发异常。
  • 使用 assert 关键字,我们可以检查特定条件是否满足,如果不满足则引发异常。
  • 在 try 子句中执行所有语句,直到找到异常。
  • 使用 except 函数来捕获和处理 try 子句中的异常。
  • 如果在 try 代码块中未引发任何异常,我们可以在 else 代码块中编写要执行的代码。

以下是 try、except、else 和 finally 子句的语法。

语法