您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > python异常处理学习
python异常处理(基础)pythonshellopen('abc.txt','r')Traceback(mostrecentcalllast):Filestdin,line1,inmoduleIOError:[Errno2]Nosuchfileordirectory:'abc.txt'打开一个不存在的文件abc.txt文件,当系统找不到abc.txt文件时,就会抛出给我们一个IOError类型的错误,Nosuchfileordirectory:abc.txt(没有abc.txt这样的文件或目录)Try...except...假如,我们已经知道这种类型的错误,那么就可以通过一个异常扑捉来扑捉这个错误。我们可以通过try...except来接收这个错误。打开文件写入:try:open(abc.txt,'r')exceptIOError:pass再来运行程序就会看不到任何错误,因为我们用except接收了这个IOError错误。pass表示实现了相应的实现,但什么也不做。假如我不是打开一个文件,而是输出一个没有定义的变量呢?try:printaaexceptIOError:pass显然,在上面的代码中我并没有对aa赋值,运行结果:Traceback(mostrecentcalllast):File/home/fnngj/py_se/tryy.py,line3,inmoduleprintaaNameError:name'aa'isnotdefined我们已经用except接收错误了,为什么错误还是还是抛出来了。如果你细心会发现这一次的错误类型是NameError,而我接收类型是IOError,所以要想接收这个print的错误,那么需要修改接收错误的类型为NameError虽然,我知道print语句是可能会抛一个NameError类型的错误,虽然接收了这个类型错误,但我不知道具体的错误提示信息是什么。那么,我能不能把错误信息打印出来呢?当然可以:try:printaaexceptNameError,msg:printmsg我们在接收错误类型的后面定义一个变量msg用于接收具体错误信息,然后将msg接收的错误信息打印。再来运行程序:name'aa'isnotdefined现在只打印了一行具体错误信息。异常的抛出机制:1、如果在运行时发生异常,解释器会查找相应的处理语句(称为handler).2、要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。3、如果在最外层(全局“main”)还是没有找到的话,解释器就会退出,同时打印出traceback以便让用户找到错误产生的原因。注意:虽然大多数错误会导致异常,但一个异常不一定代表错误,有时候它们只是一个警告,有时候它们可能是一个终止信号,比如退出循环等。try...finally...try...finally...子句用来表达这样的情况:我们不管线捕捉到的是什么错误,无论错误是不是发生,这些代码“必须”运行,比如文件关闭,释放锁,把数据库连接返还给连接池等。创建文件poem.txttryf.py复制代码importtimetry:f=file('poem.txt')whileTrue:#ourusualfile-readingidiomline=f.readline()iflen(line)==0:breaktime.sleep(2)printline,finally:f.close()print'Cleaningup...closedthefile'复制代码运行程序(在windows命令提示符或linux终端下运行):复制代码...$pythontryf.pyabcefg^CCleaningup...closedthefileTraceback(mostrecentcalllast):Filetryy.py,line18,inmoduletime.sleep(2)KeyboardInterrupt复制代码程序读poem.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl-c中断/取消程序。我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭。到目前为止,我们只讨论了如何捕捉异常,那么如何抛出异常呢?Raise抛出异常使用raise来抛出一个异常:tryr.py#coding=utf-8filename=raw_input('pleaseinputfilename:')iffilename=='hello':raiseNameError('inputfilenameerror!')程序要求用户输入一个文件名,如果用户输入的文件名是hello,那么抛出一个NameError的异常,用户输入hello和NameError异常之间没有任何必然联系,我只是人为的通过raise来这样定义,我当然也可以定义称TypeError,但我定义的异常类型必须是python提供的。附录:常见的python异常类型从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理。之所以这样,是因为不了解。这次攻python,首先把自己最畏惧和最不熟悉的几块内容列出来,里面就有「异常处理」这一项。《DiveintoPython》并没有专门介绍异常处理,只是例子中用到的时候略微说明了一下。今天下载《LearnPython》,直接进异常处理这块。这一部分有四章,第一章讲解异常处理的一般使用方法,后面的章节深入地讨论其机制。我目前只看了第一章,先学会用,以后有必要的时候再扩展阅读。python主要支持五种异常机制,一一列举。默认的异常处理器复制代码代码如下:s='Hellogirl!'prints[100]print'continue'如果我们没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断程序,调用python默认的异常处理器,并在终端输出异常信息。这种情况下,第3行代码不会执行。try…except复制代码代码如下:s='Hellogirl!'try:prints[100]exceptIndexError:print'error...'print'continue'程序执行到第2句时发现try语句,进入try语句块执行,发生异常,回到try语句层,寻找后面是否有except语句。找到except语句后,会调用这个自定义的异常处理器。except将异常处理完毕后,程序继续往下执行。这种情况下,最后两个print语句都会执行。except后面也可以为空,表示捕获任何类型的异常。try…finally复制代码代码如下:s='Hellogirl!'try:prints[100]finally:print'error...'print'continue'finally语句表示,无论异常发生与否,finally中的语句都要执行。但是,由于没有except处理器,finally执行完毕后程序便中断。这种情况下,倒第2个print会执行,到第1个不会执行。如果try语句中没有异常,三个print都会执行。assert复制代码代码如下:assertFalse,'error...'print'continue'这个语句,先判断assert后面紧跟的语句是True还是False,如果是True则继续执行print,如果是False则中断程序,调用默认的异常处理器,同时输出assert语句逗号后面的提示信息。本例情况下,程序中断,提示error,后面的print不执行。with…as复制代码代码如下:withopen('nothing.txt','r')asf:f.read()print2/0print'continue'我们平时在使用类似文件的流对象时,使用完毕后要调用close方法关闭,很麻烦。这里with…as语句提供了一个非常方便的替代方法:open打开文件后将返回的文件流对象赋值给f,然后在with语句块中使用。with语句块完毕之后,会隐藏地自动关闭文件。如果with语句或语句块中发生异常,会调用默认的异常处理器处理,但文件还是会正常关闭。这种情况下,会抛出异常,最后的print不执行。书中介绍的很详细,除了上面我提到的之外,还有很多有用的附加信息,比如try..except..finally..else可以连用,比如自定义异常类。这里不再列出,详情可以参考这本书中的介绍。python异常如何全面捕获标签:pythonexceptionimportfilec2012-04-0413:3819728人阅读评论(1)收藏举报分类:Python(11)版权声明:本文为博主原创文章,未经博主允许不得转载。如果你在写程序时遇到异常后想进行如下处理的话请参考我下面写的对异常处理的方法:假设有下面的一段程序:try:语句1语句2.语句Nexcept.........:print.......但是你并不知道“语句1至语句N”在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在“except......”这句应怎样来写呢?至少3个方法:方法一:捕获所有异常[python]viewplaincopyprint?try:a=bb=cexceptException,ex:printException,:,ex方法二:采用traceback模块查看异常[python]viewplaincopyprint?importtracebacktry:a=bb=cexcept:traceback.print_exc()方法三:采用sys模块回溯最后的异常[python]viewplaincopyprint?importsystry:a=bb=cexcept:info=sys.exc_info()printinfo[0],:,info[1]但是,如果你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:把traceback.print_exc()打印在屏幕上的信息保存到一个文本文件中[python]viewplaincopyprint?try:a=bb=cexcept:f=open(c:log.txt,'a')traceback.print_exc(file=f)f.flush()f.close()python中的异常异常是指程序中的例外,违例情况。异常机制是指程序出现错误后,程序的处理方法。当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理。Exception类是常用的异常类,该类包括StandardError,StopIteration,GeneratorExit,Warning等异常类。StandardError类是python中的错误异常,如果程序上出现逻辑错误,将引发该异常。StandardError类是所有内敛异常的基类,放置在默认的命名空间中,因此使用IOEroor,EOFError,ImportError等类,不需要导入exception模块。StopIteration类判断循环是否执行到尾部,如果循环到尾部,则抛出该异常。GeneratorExit类是由Generator函数引发的异常,当调用close()时引发该异常。Warning类表示程序中的代码引起的警告。python中的异常使用继承结构创建,可以在异常处理程序中捕获基类异常,也可以捕获各种子类异常,python中使用try...except语句捕获异常,异常子句定义在try子句后面。try...except的使用方法try...except用于处理问题语句,捕获可能出现的异常。try子句中的代码块放置可能出现异常的语句,except子句中的代码块处理异常。演示try...except语句捕获IOError异常try:file(hello.txt
本文标题:python异常处理学习
链接地址:https://www.777doc.com/doc-4210729 .html