Python基础入门-异常处理
在程序运行中会经常面临一些异常的处理,异常是一个事件,在程序运行时会发生,影响了程序的正常运行,一般情况下,在python中无法处理正常程序时,我们就要捕捉处理它,否则程序会停止运行。这么说不知道对于小白用户理解不理解。
我们说一点接地气的话语哈,就是什么意思呢?比如你写了一个登陆的脚本,但是这个登陆的脚本有段代码可能不是很稳定,有的时候可能会面临报错的可能,这种可能会导致登陆后下面的脚本无法正常运行,那么无法运行你整个的代码就会停止在哪里,但是如果有了异常的处理脚本,我们可以预见性的给登陆这里脚本加一个异常处理。如果真的是程序在登陆的时候发生报错,我们可以通过异常来捕捉他,从而不会影响下面的程序正常运行。
在简单点理解就是,有了异常可以让你的代码更健壮和牢固,容错率会降低,整个脚本会变得顺畅一些。
我们开始步入正题。首先给大家讲一个基础的例子:
try:
print a
except:
pass
我们直接打印了一个 a ,学过python的同学都知道哈,a是不被定义的,肯定是报错的,但是这个报错呢,有了except去接收,所以呢,这个代码的运行结果是没有输出的,没有任何变化,因为except把这个报错信息给截取了,没有打印出来。
当然了如果,你知道错误的具体类型,你完全可以通过下面的方式去替代。
try:
print a
except NameError:
pass
NameError是 用来接收a不被定义的报错信息,同样的他和上面的那个是一样的作用。
那么说,如果我想看一下这个报错信息到底是什么类型的呢?怎么办呢? 有这么几种方式可以满足你的好奇心。我们先看第一种。第一种呢是借助python的一个异常类来实现的。它叫Exception类怎么使用看代码:
try:
print a
except Exception,msg:
print msg
打印结果如下:
name 'a' is not defined
Exception 后面跟了一个msg这是什么鬼?其实这个就是一个变量名而已,报错信息的就用这个msg代替,print msg就是把报错信息打印出来。当然了不稀罕这种写法呢还有另外一种写法,送给追求完美处女座的你。继续看代码:
try:
print a
except Exception as msg:
print msg
打印的结果如下:
name 'a' is not defined
没错,他和上面打印的结果是一样一样的。
当然了,Python的更新也一定是不断的,当Exception异常类出来以后不久,在python的2.7版本(其实具体时间我记不清了)以后以后又出现了一个新的基类,这个类的作用也是用来捕捉异常的,和Exception异常类的用法一致。看看他张啥样吧 BaseException异常类。很多小伙伴看完这个类觉得很TM的坑爹,这不就是多了一个Base吗?我靠,确实是这样的哈。接下来我们看看他的使用姿势,这一次我们换一个例子吧。
try:
a = 10
b = 0
print a/b
except BaseException as msg:
print msg
打印的结果:
integer division or modulo by zero 除数不能为0的异常错误
看看,他的用法是不是和Exception类是一样的呢?答案是一样的呢,在或者在变个身输出一下我们看看。我们打开一个不存在的文件,看看又捕捉到了异常信息了是不是呢?
try:
a=open('text.txt','r')
a.readlines()
except BaseException,msg:
print msg
输出效果看一看:
[Errno 2] No such file or directory: 'text.txt'
没错,错误信息就是你,是你是你就是你。
OK,我们知道了Python的这两个异常类还不够,我还需要继续学习异常的处理的结构,比如,下面这个带else的玩法,你也要学会的,看代码:
try:
a=open('text.txt','r')
a.readlines()
except BaseException,msg:
print msg
else:
print 'the same as try'
打印结果:
[Errno 2] No such file or directory: 'text.txt'
主要想表达什么呢?其实我想说的就是多了一个else选择,这个选择具体执行不执行得看try下面的代码是不是正常的,如果是正常的就是执行,不是正常的就不会执行,简单理解就是和try部分的脚步保持一致啦。OK,那么我们在看一个else代码执行的内容。我们要保证try代码部分的正确性。看表演:
try:
a = 'hello'
print a
except BaseException,msg:
print msg
else:
print 'the same as try'
输出结果
hello
the same as try
来看一下吧。我们给a定义了一个值,所以try部分的代码是正常的,正常被打印,同样的else也是一样的else语句也是被打印出来了,6不6呢?没错,else语句的执行和try部分的代码是保持同步的。
我们继续来看一个finally的用法。finally表示的是最后,如果和try else在一起结合使用会产生什么样的火花呢?我们看代码:
首先我们先保证try代码部分的正确性:
try:
a = 'hello'
print a
except BaseException,msg:
print msg
else:
print 'the same as try'
finally:
print 'however is error or right i was running'
输出结果:
hello
the same as try
however is error or right i was running
然后我们保证try代码部分的不正确性,比如拿刚刚那个例子看,我们定义一个不被定义的变量a
try:
print a
except BaseException,msg:
print msg
else:
print 'the same as try'
finally:
print 'however is error or right i was running'
看代码执行结果:
name 'a' is not defined
however is error or right i was running
是不是很诧异呢?
总结就是一句话,finally一出现,不管前面的try部分的代码是否是正确的,finally的代码块都会正常被运行。好牛逼的样子哦。。。。
在给大家分享关于异常的最后一个用法 raise的用法。raise用法主要在实际中自定义一些异常,然后给抛出,这个抛出信息可以是自己自定义的信息。接下来我们看下他的正确使用的姿势?看代码:
from random import randint
number = randint(1,9)
if number %2==0:
raise NameError("%d is even "%number)
else:
raise NameError("%d is odd "%number)
运行结果:
raise NameError("%d is even "%number)
NameError: 4 is even
我们写了一个if语句用来判断随机生成的数字是奇数还是偶数?
如果是奇数就抛出名字错误,随机生成的数字是奇数,反之,随机生成的数字是偶数。
关于异常部分的介绍我们就到这里了。