视频教程下载链接:http://pan.baidu.com/s/1pKP7zDL 配套教程下载:http://pan.baidu.com/s/1qYdI6q4 大家好,这节课,我们来学习异常,什么是异常呢?首先,我们得区分语法错误和异常的区别,因为当我们在编写或者调试程序的时候,它们看起来非常相似,但是却是截然不同的2个东西,所以现在,我们写一个简单的程序来说明具体的概念和区别,首先,我们定义一个变量来获取用户的输入,这里需要使用到input函数:
numb = input("你最喜欢的数字是?") |
所以这行代码的意思是获取用户的输入,然后将输入转化为numb变量,由于input返回的是一个字符串,所以这里我们把它转化为int:
numb = int(input("你最喜欢的数字是?")) |
然后我们将这个数字打印出来:
print(numb) |
运行,我最喜欢的数字是2,你看,屏幕中打印出了2:
图 7‑11
一切都很顺利,但是假如这里我输入的不是数字而是字符,比如说这里我输入two,运行:
图 7‑12
这里提示ValueError,这是因为你不可以将一个字符串two通过int函数转换为数字。所以即使我们的代码没有语法错误,程序还是可以在运行的时候出现异常,所以这就是语法错误和异常的区别。这里所说的语法错误是指代码本身的错误,比如说input输成了in put,当然这不合理,这就是语法错误,运行:
图 7‑13
你看,直接报了语法错误:SyntaxError,而我们刚才是ValueError。ValueError是异常的一种类型,它通常是在我们尝试把一个类型转换为整型失败时,会被触发。
其实,异常有很多种类,在我们编写程序时,当然不允许异常的发生,因为这样会中止程序的运行。就像我们刚刚举的例子一样,如果输入的不是数字,会触发异常,从而终止程序的运行。所以接下来,我们将来展示如何去处理异常。
首先,我们写一个While循环,它的判断条件始终为true,这样的循环只有在出现break语句时,才会正常的终止。
while True: |
接下来,我们来使用try语句处理异常,所以首先,输入关键字try,然后分号回车,输入我们想要执行功能的代码,这里我们输入课程开始时的代码,最后记得break掉这个循环:
try: |
所以,什么时候你会用到try语句呢?就是当你感觉你编写的某段代码极有可能抛出异常时,就可以使用try语句捕获异常,然后对异常进行处理。
我们来看这段代码,如果我最喜欢的数字是2,那么程序会打印出18/2也就是9,然后break掉,没有任何问题,那么如果这里输入的是一个字符串’two’,这个时候就需要使用关键字except来捕获异常了,并且可以提示"请确保输入的是数字":
except ValueError: |
以上是一个简单的处理异常的例子程序,它可以提高程序的健壮性。我们不妨调试程序来增加大家的理解,首先在这2个地方下断点:
图 7‑14
当我们输入2时,程序直接break掉,没有捕获任何异常:
但是如果我们输入“two”时:
图 7‑15
你看,这里成功的捕获了异常,并输出提示:
图 7‑16
因为这里我们成功的捕获了异常,所以这里While循环不会被终止,我们还可以接着输入,直到输入数字时,循环会通过break中止。
实际上,ValueError只是众多异常中的一种,它只在类型转换为int型失败时被触发。我们可以继续运行这个程序来看另一种异常,如果我们这里输入数字是0,运行:
图 7‑17
你看,它抛出了一个除数为0错误的异常,这是因为0是不能作为除数的,18/0,触发了这个异常,同样,我们可以来捕获并处理这个异常:
except ZeroDivisionError: |
如果再输入0,程序会捕获到这个异常并输出。
有时候我们会遇到这种情况,你预感到程序会触发异常,但是不知道程序会触发哪种异常,这时候,可以直接通过关键字except捕获所有的异常:
except: |
但是在百分之99的情况下我不推荐大家这样做,因为这样做后,你的代码容易隐藏很多bug,因为很多错误都通过异常捕获了,从而不会反映到程序中。所以大家最好只捕获你想捕获的异常。
最后呢,我们来介绍关键字finally,它的意思是,不管有没有触发异常,都要执行finally后面的语句,比如说这里输入:
finally: |
这样,不管有没有触发异常,都会打印出"本次循环结束"。 所以这就是关于异常的全部内容,非常繁琐,但很有必要,特别是在使用Python进行界面开发的时候。 更多精彩内容尽在视频中!