首页
学习
活动
专区
工具
TVP
发布

Python-第六讲-异常

Python--第六讲-异常

起飞

上上一讲我们讲了Python的输入,也利用了输入做了一些事情,谢了一个小小的计算器,可以做一些简单的计算,但是,想来你们应该会做一些恶作剧聪明的尝试,比如输入一个式子,想看看某个数除以0会怎么办,对吧。

学过数学的我们都知道,当零作为除数是不行得,所以你们除以0时会看到这个结果:

这是什么意思呢?

现在告诉你们,其实程序的解释器也会给我们找出错误,并且提示我们,并且告诉我们哪里错误,让我们去改正。

第一行,告诉我们有了异常。

第二行,告诉我们在哪个文件(因为我是在命令行中直接5/0的,所以是这个stdin ,若是你们的创建的文件,会提示在哪个文件中),哪一行。

第三行,首先告诉我们错误名称:ZeroDivisionError,然后告诉我们主要原因是零不能做除数。

有些同学会说,这不是挺好的吗,是挺好的,会告诉我们错在了哪怎么错了,但是,异常会直接终止程序的进行,如果下面还有事情怎么办呢?

这时候我们就需要把这个错误捕获到,并且进行其他的处理,问题来了,怎么捕获异常,请看:

在我的程序中,我加入了两句话:

try:

except 异常名称:

这就是异常捕获语句,try后面的语句中,如果有了错误,会将这个错误传递到excrpt那里,和我写在后面的ZeroDivisionError比较,如果是这个错误,则执行这个except下的语句。

若没有异常,则会执行try里面的语句,即正常执行我们的计算器程序,最后的程序结束也会被打印出来,因为这个打印程序结束不属于try和except的任何一个,是独立存在的。

这就是异常处理的方法,仅仅只需要一个try和一个except就可以完成了。

那么,如果我不知道会发生什么异常或者多个异常怎么办呢?

可以看到,我把except中的异常删除了,即只写了except,这样,只要发生异常,不论什么异常都会执行这个程序,关于多个异常的情况,请看下面的代码:

在上面的代码里,我写了两个except,这样是符合语法格式的,只要和上面的try的缩进一致就代表是一体的。

我们这次的输入是一个字符串,很明显,字符串经过了eval()函数就变成了一串字母,在Python解释器中,这个字母相当于一个变量,而这里没有这个变量,所以这个异常就是这个名字未定义。(大家下去可以试一下,肯定是这样的。)

如果我们现在想知道某个异常是什么,或者说发生了什么异常,怎么办呢?有没有办法把这个异常打印出来,当然是在正常结束程序的情况下,方法是有的,我们可以这样:

请看箭头标注的地方,打印出了我们的异常名称,而且正常的执行程序了。

我在第二个except处,写了一个Exception as e,Exception是一个类,类的名字就是Exception,except捕获到异常后,传递给 e 这个变量,然后我们直接打印这个 e 就得到了我们的异常类型。

很不巧,这时候我们的客户又有了新的需求,他说,我想在没有异常发生时做某些事情,怎么办呢?如果放在最后面,那么无论异常是否发生,程序肯定会执行这些代码,其实,try还有一个else 我们没有使用:

我们可以在最后按照语法的缩进在加一个else,意思就是,只要没有异常发生,才会做的事情,如图可见,我们输入了一个正常的式子,程序便执行了我们的代码。

既然异常中有判断,那么我们能不能写一句话,让是否有这个异常的情况下都会执行这句话呢?答案是肯定的,和else类似的

如图,我在最后面加了一个finally,这就是说,无论如何都会执行的一句话,无论是否有异常发生,无论这个异常是否能捕获到,即,只要程序能正常的进入try语句,那么,不论发生什么事情,这句话一定会被执行!!!!

有的同学会说,那么在最后面加不就行了?不行!因为如果有其他错误的话,没有捕获到,在最后面就不会执行了,如:

这个程序结束都没输出,而finally中的输出了,这就是两者最大的区别,同学们一定要分清楚!

关于异常的捕获就讲到这里,谢谢大家观看!

降落

如果觉得讲的不错,就关注转发吧

O(∩_∩)O哈哈~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180727G17JBL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券