Python之异常处理学习(二十七)

在编写程序的时候,某些时候需要处理异常,比如写一个除法的函数或者方法,分母是0,那么这样的程序

肯定是要处理异常的,我们来看看如果不异常处理,会怎么样,见代码:

复制代码
#!/usr/bin/env python 
#-*- coding:utf-8 -*-

def f():
    print 1/0

f()
复制代码

 

如上的函数就是一个对异常没有处理的函数,代码让我们更加很奇怪,见执行后,输出的实际的结果:

复制代码
C:\Python27\python.exe D:/git/Python/FullStack/Study/day1/index.py
Traceback (most recent call last):
  File "D:/git/Python/FullStack/Study/day1/index.py", line 7, in <module>
    f()
  File "D:/git/Python/FullStack/Study/day1/index.py", line 5, in f
    print 1/0
ZeroDivisionError: integer division or modulo by zero
复制代码

 

程序执行后,出现了异常,那么我们就需要来处理异常,让程序更好的执行,而不是对异常不处理,导致

代码执行后,出现如上的错误信息,见修改后的代码:

复制代码
#!/usr/bin/env python 
#-*- coding:utf-8 -*-

def f():
    try:
        print 1/0
    except Exception as e:
        print u'程序出现异常,异常的详细信息是:',e

f()
复制代码

 

执行如上的代码后,我们可以获取到详细的异常错误信息,见输出的结果内容:

C:\Python27\python.exe D:/git/Python/FullStack/Study/day1/index.py
integer division or modulo by zero

 

       在python中,关于异常和错误官方给出了详细的解释和说明,这里不再进行重复的说明,见官方的地址

https://docs.python.org/2/tutorial/errors.html#exceptions。我们下来主要看异常的处理过程,以及整个思路,

比如有这样的一个逻辑,在进行自动化的测试中,需要创建一个用户,那么创建前也不知道用户是否存在,如

果存在,就删除用户,再创建用户,如果不存在,就创建用户,那么使用异常怎么样来实现这样的一个过程了,

它实现的代码为:

复制代码
#!/usr/bin/env python 
#-*- coding:utf-8 -*-

def createUser():
    '''
    创建用户
    :return:
    '''

def selectUser():
    '''
    查询用户
    :return:
    '''

def delUser():
    '''
    删除用户
    :return:
    '''

def isCreate():
    try:
        selectUser()
        delUser()
    except:
        createUser()
    else:
        createUser()
    finally:
        pass
复制代码

 

OK,如上的实例代码是一个比较简单的代码,那么我们重点来看函isCreate()的执行顺序,它的执行顺序是:

 

1.先执行try部分的代码,到try部分,会出现判断

2.如果try执行通过,就直接执行else代码块,再执行finally的代码块,代码执行结束

3.如果try执行不通过,就直接执行expect代码块,再执行finally代码块,代码执行结束

那么依据如上的执行结果以及执行的顺序,可以得出的结论是:

1.不管try是否执行失败或者成功,都得必须执行finally代码块

2.在try执行失败后,执行expect代码块中,因为对于一个异常,程序也是无法确定到底是那种

异常,就会有多种异常来引发,直接找到正确的异常,见这样的一个案例代码:

复制代码
#!/usr/bin/env python 
#-*- coding:utf-8 -*-

def divisn(a,b):
    try:
        a/b
    except ValueError as e:
        print e
    except ZeroDivisionError as e:
        print e
    except IndexError as e :
        print e
    except RuntimeError as e:
        print e
    else:
        print u'try执行通过就这些我了'
    finally:
        print u'不管怎么执行,我都是要执行的,欧也!'
        
divisn(3,0)
复制代码

 

见执行如上的函数后,输出的内容:

C:\Python27\python.exe D:/git/Python/FullStack/Study/day1/index.py
integer division or modulo by zero
不管怎么执行,我都是要执行的,欧也!

 

     在异常中,某些时候需要主动引发异常,比如我们请求一个页面,如果该页面不存在,就会跳转到404的页面,

如果不主动引发异常,可能显示出错误的代码,这样的信息是我们最不愿意可见的,比如我们使用django框架来

实现这样的一个过程,编写一个登录的函数,如果login.html页面存在,就跳转到login.html的页面,如果不存在,

就主动引发404的页面,见实现的代码:

复制代码
#!/usr/bin/env python
#coding:utf-8

from django.shortcuts import render
from django.http import  Http404

# Create your views here.

def login(reqest):
    try:
        render(reqest,'app/login.html',locals())
    except:
        raise  Http404(u'SORRY,PAGE IS NOT FOUND!')
复制代码

执行命令python manage.py runserver启动后,在浏览器中访问http://localhost:8000/login/

将会出现如上的截图:

如果不主动引发异常,就会显示出详细的代码错误,见修改后的代码:

复制代码
#!/usr/bin/env python
#coding:utf-8

from django.shortcuts import render
from django.http import  Http404

# Create your views here.

def login(reqest):
    return render(reqest,'app/login.html',locals())
复制代码

再次访问http://localhost:8000/login/,会显示出如下的截图:

代码都显示出来,很显然,这是很不理性的,显示出错误的代码对于用户来说,是很崩溃的,404大家马上就知道什么错误了。实现代码见附件:https://files.cnblogs.com/files/weke/Auto.rar

猜你喜欢

转载自blog.csdn.net/yyang3121/article/details/80624192