Python编程基础:第二十九节 异常Exception

第二十九节 异常Exception

前言

我们在写代码时不可避免地会出错,这时候编译器便会抛出异常并中断程序的执行。针对这种情况,我们可以采用异常处理的方式捕捉程序中的异常信息,并将异常信息打印出来供程序员分析,同时呢还要避免因为程序抛出异常而中断其继续向下执行。异常检测代码结构如下:

try:
	要检测异常信息的代码段
except 异常信息 as e:
	要打印的报错信息供程序员分析
else:
	如果要检测的代码段没有发生异常,那就执行这部分代码
finally:
	无论程序是否有异常,这里的代码均可以执行

实践

我们以分母为0为例学习异常处理的相关内容,众所周知在除法中分母是不能为0的,若分母为0,程序便会抛出异常信息:

numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> ZeroDivisionError: division by zero

可见程序抛出了异常信息ZeroDivisionError并且中断执行。此时我们便可以通过try-except结构来捕捉异常信息:

try:
    numerator = int(input("Enter a number to divide: "))
    denominator = int(input("Enter a number to divide by: "))
    result = numerator / denominator
except ZeroDivisionError as e:
    print("You can't divide by zero! idiot!")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> You can't divide by zero! idiot!

可见此时程序并没有中断,当其发现程序中有ZeroDivisionError时,便执行print("You can't divide by zero! idiot!")这行代码用于提示程序员发生了除零错误。
那么如果我们不小心把除数写成了字符串会发生什么呢?

numerator = int(input("Enter a number to divide: "))
denominator = int(input("Enter a number to divide by: "))
result = numerator / denominator
print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: david
>>> ValueError: invalid literal for int() with base 10: 'david'

可见代码抛出了ValueError,提示程序员这里应该是int型数据而不是字符串,那么我们同样可以使用异常处理方式捕捉这个异常信息:

try:
    numerator = int(input("Enter a number to divide: "))
    denominator = int(input("Enter a number to divide by: "))
    result = numerator / denominator
except ZeroDivisionError as e:
    print("You can't divide by zero! idiot!")
except ValueError as e:
    print("Enter only numbers plz")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: david
>>> Enter only numbers plz

不难发现程序捕捉到了这个异常信息,并打印出Enter only numbers plz,用于提醒用户只能输入数字,不能输入字符串。其实Python中包含了许许多多的异常信息用于帮助程序员分析代码,如果我们想让代码检测所有的异常信息,那么就用到了下述代码:

try:
    numerator = int(input("Enter a number to divide: "))
    denominator = int(input("Enter a number to divide by: "))
    result = numerator / denominator
except ZeroDivisionError as e:
	# 用于打印程序自带的异常信息
    print(e)
    print("You can't divide by zero! idiot!")
except ValueError as e:
    print(e)
    print("Enter only numbers plz")
except Exception as e:
    print(e)
    print("something went wrong :(")

也就是不指定特定的异常信息,用Exception来代替,这样做的好处就是程序即便发现了异常也不会中断会继续执行下去。这里需要注意的是,在判断异常时,一定是先判断是否是某一类异常,最后再判断是否是一个异常信息。那么如果程序没有异常时,我们希望它能执行的代码放在else语句下边:

try:
    numerator = int(input("Enter a number to divide: "))
    denominator = int(input("Enter a number to divide by: "))
    result = numerator / denominator
except ZeroDivisionError as e:
    print(e)
    print("You can't divide by zero! idiot!")
except ValueError as e:
    print(e)
    print("Enter only numbers plz")
except Exception as e:
    print(e)
    print("something went wrong :(")
else:
    print(result)
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 1
>>> 5.0

可见,当我们的输入都合法时,程序就会得到两个数相除的计算结果并打印到控制台。其实我们还可以书写一些代码,这些代码无论程序是否发生异常,他们都会被执行,这些代码需要放在finally的下面:

try:
    numerator = int(input("Enter a number to divide: "))
    denominator = int(input("Enter a number to divide by: "))
    result = numerator / denominator
except ZeroDivisionError as e:
    print(e)
    print("You can't divide by zero! idiot!")
except ValueError as e:
    print(e)
    print("Enter only numbers plz")
except Exception as e:
    print(e)
    print("something went wrong :(")
else:
    print(result)
finally:
    print("This will always execute")
>>> Enter a number to divide: 5
>>> Enter a number to divide by: 1
>>> 5.0
>>> This will always execute

>>> Enter a number to divide: 5
>>> Enter a number to divide by: 0
>>> division by zero
>>> You can't divide by zero! idiot!
>>> This will always execute

以上便是异常的全部内容,感谢大家的收藏、点赞、评论。我们下一节将介绍文件检测(File Detection),敬请期待~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值