在编写程序的时候,某些时候需要处理异常,比如写一个除法的函数或者方法,分母是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, inf() 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