Python 异常处理

本章节整理了如何使用 try、except 和 finally 语句处理 Python 程序中的异常。

本章节整理了如何使用 try、except 和 finally 语句处理 Python 程序中的异常。

Python 提供了 try 语句处理异常。可能引发异常的关键操作放置在 try 子句中;处理异常的代码写在 except 子句中;不管是否有异常都要执行的代码放在 finally 子句中。

捕获异常

当发生错误或异常时,Python 通常会停止并生成错误消息。

如下,在控制台中直接输出为定义的变量会产生 NameError 错误,导致程序崩溃。

>>> print(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

为了能够正确的处理错误或者异常,可以使用 try 语句处理错误或者异常。

以下示例中,使用 try 语句处理错误:

try:
  print(x)
except:
  print("An exception occurred")

由于 try 块中的代码引发错误,因此将执行 except 块中的代码,程序输出了以下内容:

An exception occurred

可见,try 语句能保证在程序出现错误或异常的时候不崩溃,并可以采取一些处理的错误,比如输出一个提示消息给用户。

单独处理异常

except 块可以指定要处理的错误或者异常类型,当出现此类错误或异常时,对应的 except 块代码块就会执行。这种机制可以让我对不同的异常采取不同的处理措施。

以下示例中,当出现 NameError 错误的时候,会提示一条明确的信息,当出现其他错误或异常的时候,提示一个通用的信息。

try:
  print(x)
except NameError:
  print("Variable x is not defined")
except:
  print("Something else went wrong")

输出:

Variable x is not defined

else 子句

try 子句可以结合 else 子句,当没有出现错误的时候,就会执行 else 子句中的代码块。 else 子句是可选的。

在这个例子中, try 块不会产生任何错误:

try:
  print("Hello")
except:
  print("Something went wrong")
else:
  print("Nothing went wrong")

输出:

Hello
Nothing went wrong

finally 子句

try 子句可以结合 finally 子句,无论是否出现错误或异常,都会执行 finally 子句中的代码块。 finally 子句是可选的。

try:
  print(x)
except:
  print("Something went wrong")
finally:
  print("The 'try except' is finished")

finally 子句对于关闭对象和清理资源很有用。

尝试打开并写入不可写的文件:

f
try:
  f = open("demofile.txt")
  f.write("Lorum Ipsum")
except:
  print("Something went wrong when writing to the file")
finally:
  f.close()

程序可以继续,而无需打开文件对象。

抛出异常

作为 Python 开发人员,可以在某个条件发生时抛出异常。raise 关键字用于抛出一个异常。

如果 x 小于 0,则引发错误并停止程序:

x = -1

if x < 0:
  raise Exception("Sorry, no numbers below zero")

raise 关键字用于引发异常。

您可以定义要引发的错误类型以及要打印给用户的文本。

如果 x 不是整数,则抛出 TypeError

x = "hello"

if not type(x) is int:
  raise TypeError("Only integers are allowed")

请不要随意抛出异常,如果只抛出异常而不处理,则会导致程序停止。

抛出异常结合捕获异常可以控制程序的业务逻辑。比如在检查用户输入的时候,都抛出各自的校验异常,然后统一捕获这些异常,再将错误信息反馈给用户,这让程序处理变得简单。