Python基础教程

002_用if_else处理异常

用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吧,下节见。

这篇文章对您有用吗?

我们要如何帮助您?