赞
踩
本篇我们将会学习如何使用 try…except 语句处理程序中的异常。
Python 中存在两种类型的错误:语法错误(syntax error)和异常(exception)。
当我们编写了无效的 Python 代码时,程序将会返回语法错误。例如:
current = 1
if current < 10
current += 1
运行以上代码将会返回下面的错误:
File "d:/python/try-except.py", line 2
if current < 10
^
SyntaxError: invalid syntax
以上示例中,Python 解释器检测到了错误,因为 if 语句后面缺少一个冒号(:)。Python 解释器显示了错误所在的文件名和行号,我们可以基于这些信息找到并修改错误。
即使代码中没有语法错误,它在执行过程中也可以产生错误。Python 将执行过程中的错误称为异常。异常产生的主要原因来自代码执行的环境。例如:
当异常发生时,程序不会自动对其进行处理,而是产生一个错误信息。例如,以下程序用于计算销售增长率:
# 获取净销售额 print('输入净销售额') previous = float(input('- 上一期:')) current = float(input('- 本期:')) # 计算销售额变化的百分比 change = (current - previous) * 100 / previous # 显示结果 if change > 0: result = f'Sales increase {abs(change)}%' else: result = f'Sales decrease {abs(change)}%' print(result)
以上代码执过程如下:
当我们运行代码并输入“120’”作为本期净销售额时,Python 解释器将会返回以下输出:
输入净销售额
- 上一期:100
- 本期:120'
Traceback (most recent call last):
File "d:/python/try-except.py", line 5, in <module>
current = float(input('- Current period:'))
ValueError: could not convert string to float: "120'"
Python 解释器显示了包含异常详细信息的错误跟踪(traceback):
由于 float() 函数无法将字符串“120’”转换为数字,Python 解释器产生了一个 ValueError 异常。
Python 提供了不同类型的异常,例如 TypeError、NameError 等。
为了使得程序更加健壮,我们需要处理可能的异常。也就是说,我们需要捕获异常并通知用户,以便他们能够修复异常。
处理异常的推荐方式不是直接显示 Python 解释器返回的错误,而是显示一个更加友好的信息。为此,我们可以使用 try…except 语句:
try:
# 业务代码
except:
# 错误处理
以上语句的执行过程如下:
以下流程图演示了 try…except 语句的执行过程:
因此,使用 try…except 语句处理异常时,我们需要将可能导致异常的代码放在 try 分支中,将处理异常的代码放在 except 分支中。
下面我们重新上文中的示例,使用 try…except 语句处理异常:
try: # 获取净销售额 print('输入净销售额') previous = float(input('- 上一期:')) current = float(input('- 本期:')) # 计算销售额变化的百分比 change = (current - previous) * 100 / previous # 显示结果 if change > 0: result = f'销售额增加了 {abs(change)}%' else: result = f'销售额减少了 {abs(change)}%' print(result) except: print('错误!净销售额必须是一个数字。')
If you run the program again and enter the net sales which is not a number, the program will issue the message that you specified in the except block instead:
输入净销售额
- 上一期:100
- 本期:120'
错误!净销售额必须是一个数字。
当我们为上一期净销售额输入数字 0 时,将会返回以下信息:
输入净销售额
- 上一期:0
- 本期:100
错误!净销售额必须是一个数字。
在这种情况下,上一期和本期的净销售额都是数字,但是程序仍然返回了一个错误信息。这是因为发生了另一个异常。
try…except 语句可以处理特定的异常。为了捕获指定的异常,我们可以在 except 关键字后面加上异常的类型:
try:
# 业务代码
except ValueError as error:
# 异常处理
例如:
try: # 获取净销售额 print('输入净销售额') previous = float(input('- 上一期:')) current = float(input('- 本期:')) # 计算销售额变化的百分比 change = (current - previous) * 100 / previous # 显示结果 if change > 0: result = f'销售额增加了 {abs(change)}%' else: result = f'销售额减少了 {abs(change)}%' print(result) except ValueError: print('错误!净销售额必须是一个数字。')
此时如果我们输入一个字符串作为净销售额,将会返回相同的错误信息。但是,如果我们输入数字 0 作为上一期的净销售额:
输入净销售额
- 上一期:0
- 本期:100
程序将会返回以下错误:
Traceback (most recent call last):
File "d:/python/try-except.py", line 9, in <module>
change = (current - previous) * 100 / previous
ZeroDivisionError: float division by zero
此时返回的异常类型为 ZeroDivisionError。以下语句导致了除零错误:
change = (current - previous) * 100 / previous
原因就是变量 previous 的值为零。
try…except 语句可以指定多个 except 分支,用于处理多个异常:
try:
# 业务代码
except Exception1 as e1:
# 异常处理
except Exception2 as e2:
# 异常处理
except Exception3 as e3:
# 异常处理
这种方式可以针对不同类型的异常分别进行处理。
如果想要对几种类型的异常进行相同的处理,可以将它们放在一个 except 分支中:
try:
# 业务代码
except (Exception1, Exception2):
# 异常处理
以下示例使用 try…except 语句对 ValueError 和 ZeroDivisionError 异常分别进行了处理:
try: # 获取净销售额 print('输入净销售额') previous = float(input('- 上一期:')) current = float(input('- 本期:')) # 计算销售额变化的百分比 change = (current - previous) * 100 / previous # 显示结果 if change > 0: result = f'销售额增加了 {abs(change)}%' else: result = f'销售额减少了 {abs(change)}%' print(result) except ValueError: print('错误!净销售额必须是一个数字。') except ZeroDivisionError: print('错误!上一期净销售额不能为零。')
当我们输入数字 0 作为上一期的净销售额时:
输入净销售额
- 上一期:0
- 本期:100
将会返回以下错误:
错误!上一期净销售额不能为零。
推荐在异常列表的最后增加一个捕获 Exception 的代码块,用于处理其他通用错误:
try: # 获取净销售额 print('输入净销售额') previous = float(input('- 上一期:')) current = float(input('- 本期:')) # 计算销售额变化的百分比 change = (current - previous) * 100 / previous # 显示结果 if change > 0: result = f'销售额增加了 {abs(change)}%' else: result = f'销售额减少了 {abs(change)}%' print(result) except ValueError: print('错误!净销售额必须是一个数字。') except ZeroDivisionError: print('错误!上一期净销售额不能为零。') except Exception as error: print(error)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。