用if...else处理异常
异常会使程序停止,只有处理掉异常,使程序执行时避开异常代码才能使程序正常运行。
处理异常的方法有两种,一种是if...else,还有一种是try...except。二者各有优缺点,根据情况选用。
处理异常就是根据情况避开会发生异常的代码(不去执行会发生异常的代码),而去选择执行正常代码(比如信息提示)。
用if...else处理异常
异常是在有些情况时发生,如果我们把发生异常的情况考虑进来,用条件判断,当情况正常时运行,情况不允许时避开,那么就处理好了这种异常。
下面用上一节除法函数为例,用if...else展开分母为0的异常。
# 定义除法函数
def divi(x,y):
if y==0:
print("调用者,你太大意了,这个分母为0,不能做除法")
else:
if x>y:
z=x/y
return z
res=divi(6,0)
print(res)
运行结果(避开了异常)
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t25.py
调用者,你太大意了,这个分母为0,不能做除法
None
Process finished with exit code 0
整个程序能够正常运行,没有发生异常。程序没有执行“z=x/y”的除法语句,原因是if...else选择性执行了分母为0时的语句,避开了除法异常的语句。
其实,为了保证程序能够正常执行,大家平时都在处理异常。
用if...else处理异常的缺点
缺点是异常情况太多,用if...else处理异常太麻烦。有时,处理异常的代码要比正常业务代码多很多。太难了,编写完全没有异常的程序太难了。
还是以除法函数为例。虽然上面已经用if...else处理异常了,但是,有时候它还是会发生异常,代码如下。
# 定义除法函数
def divi(x,y):
if y==0:
print("调用者,你太大意了,这个分母为0,不能做除法")
else:
if x>y:
z=x/y
return z
res=divi(6,"2")
print(res)
运行结果(异常)
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t25.py
Traceback (most recent call last):
File "E:/wkp01/p00/test01/atestpkg/t25.py", line 10, in <module>
res=divi(6,"2")
File "E:/wkp01/p00/test01/atestpkg/t25.py", line 6, in divi
if x>y:
TypeError: '>' not supported between instances of 'int' and 'str'
Process finished with exit code 1
防不胜防,又出现了个“TypeError”异常。这个异常的意思是说,输入的分母类型错误,它是个字符串str,不是个int数字类型。
当然,我们可以再用if...else来判断,并处理这个情况。比如,我们用if判断,如果是字符串类型,那么使用int()函数转换成数字,然后再进行除法运算。
# 定义除法函数
def divi(x,y):
if not isinstance(y,int):
y=int(y)
if y==0:
print("调用者,你太大意了,这个分母为0,不能做除法")
else:
if x>y:
z=x/y
return z
res=divi(6,"2")
print(res)
运行结果(避开了异常)
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t25.py
3.0
Process finished with exit code 0
这样避开了第二个异常情况。还有没有其他异常情况?有,请看下面代码
# 定义除法函数
def divi(x,y):
if not isinstance(y,int): # 如果y不是int类型,就转换成int类型
y=int(y)
if y==0:
print("调用者,你太大意了,这个分母为0,不能做除法")
else:
if x>y:
z=x/y
return z
res=divi(6,"abcd")
print(res)
运行结果(异常)
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t25.py
Traceback (most recent call last):
File "E:/wkp01/p00/test01/atestpkg/t25.py", line 12, in <module>
res=divi(6,"abcd")
File "E:/wkp01/p00/test01/atestpkg/t25.py", line 4, in divi
y=int(y)
ValueError: invalid literal for int() with base 10: 'abcd'
Process finished with exit code 1
崩溃,程序崩溃,我们也崩溃了。
发生异常的情况太多了,防不胜防。要处理多情况异常还是使用try...except吧,下节见。