自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
在程序开发时,有些错误并不是每次运行都会出现。例如,实例01,只要输入的数据符合程序的要求,程序就可以正常运行,否则将抛出异常并停止运行。假设在输入苹果的数量时,输入了23.5,那么程序将抛出如图3所示的异常。
图3 抛出ValueError异常
这时,就需要在开发程序时对可以出现异常的情况进行处理。
在Python中,提供了try…except语句捕获并处理异常。在使用时,把可能产生异常的代码放在try语句块中,把处理结果放在except语句块中,这样,当try语句块中的代码出现错误时,就会执行except语句块中的代码,如果try语句块中的代码没有错误,那么except语句块将不会执行。具体的语法格式如下:
try:
block1
except [ExceptionName [as alias]]:
block2
参数说明:
l block1:表示可能出现错误的代码块。
l ExceptionName [as alias]:可选参数,用于指定要捕获的异常。其中,ExceptionName表示要捕获的异常名称,如果在其右侧加上as alias,则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。
说明:在使用try…except语句捕获异常时,如果在except后面不指定异常名称,则表示捕获全部异常。
l block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。
说明:使用try…except语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。
下面将对实例01进行改进,加入捕获异常功能,对除数不能为0的情况进行处理。
实例02 模拟幼儿园分苹果(除数不能为0)
在IDLE中创建一个名称为division_apple_0.py的文件,然后将实例01的代码全部复制到该文件中,并且对“if __name__ == '__main__':”语句下面的代码进行修改,应用try…except语句捕获执行division()函数可能抛出的ZeroDivisionError(除数为零)异常,修改后的代码如下:
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
children = int(input("请输入来了几个小朋友:"))
result = apple // children # 计算每人分几个苹果
remain = apple - result * children # 计算余下几个苹果
if remain > 0:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,
"个,剩下", remain, "个。")
else:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except ZeroDivisionError: # 处理异常
print("\n出错了 ~_~ ――苹果不能被0个小朋友分!")
执行以上代码,输入苹果的数量为10,小朋友的人数为0时,将不再抛出异常,而是显示如图4所示的结果。
图4 除数为0时重新执行程序
目前,我们只处理了除数为0的情况,如果将苹果和小朋友的数量输入成小数或者不是数字会是什么结果呢?再次运行上面的实例,输入苹果的数量为2.7,将得到如图5所示的结果。
图5 输入的数量为小数时得到的结果
从图5中可以看出,程序中要求输入整数,而实际输入的是小数,则抛出ValueError(传入的值错误)异常。要解决该问题,可以在实例02的代码中,为try…except语句再添加一个except语句,用于处理抛出ValueError异常的情况。修改后的代码如下:
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
children = int(input("请输入来了几个小朋友:"))
result = apple // children # 计算每人分几个苹果
remain = apple - result * children # 计算余下几个苹果
if remain > 0:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result,
"个,剩下", remain, "个。")
else:
print(apple, "个苹果,平均分给", children, "个小朋友,每人分", result, "个。")
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except ZeroDivisionError: # 处理异常
print("\n出错了 ~_~ ――苹果不能被0个小朋友分!")
except ValueError as e: # 处理ValueError异常
print("输入错误:", e) # 输出错误原因
再次运行程序,输入苹果的数量为小数时,将不再直接抛出异常,而是显示友好的提示,如图6所示。
图6 输入的数量为小数时显示友好的提示
多学两招:在捕获异常时,如果需要同时处理多个异常也可以采用下面的代码实现:
try: # 捕获异常
division() # 调用分苹果的函数
except (ValueError,ZeroDivisionError ) as e: # 处理异常
print("出错了,原因是:",e) # 显示出错原因
即在except语句后面使用一对小括号将可能出现的异常名称括起来,多个异常名称之间使用逗号分隔。如果想要显示具体的出错原因,那么再加上as指定一个别名。