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语句用来判断随机生成的数字是奇数还是偶数?

如果是奇数就抛出名字错误,随机生成的数字是奇数,反之,随机生成的数字是偶数。

关于异常部分的介绍我们就到这里了。

posted @ 2018-01-12 16:55  IT测试老兵  阅读(426)  评论(1编辑  收藏  举报
作者:测试老兵
出处:https://www.cnblogs.com/fighter007/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。