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")
请不要随意抛出异常,如果只抛出异常而不处理,则会导致程序停止。
抛出异常结合捕获异常可以控制程序的业务逻辑。比如在检查用户输入的时候,都抛出各自的校验异常,然后统一捕获这些异常,再将错误信息反馈给用户,这让程序处理变得简单。