若是你在写python程序时遇到异常后想进行以下处理的话,通常用try来处理异常,假设有下面的一段程序:java
try: 语句1 语句2 . . 语句N except .........: do something .......
可是你并不知道"语句1至语句N"在执行会出什么样的异常,但你还要作异常处理,且想把出现的异常打印出来,并不中止程序的运行,因此在"except ......"这句应怎样来写呢?python
总结了一下3个方法:函数
方法一:捕获全部异常fetch
try: a=b b=c except Exception,e: print Exception,":",e
方法二:采用traceback模块查看异常日志
#引入python中的traceback模块,跟踪错误 import traceback try: a=b b=c except: traceback.print_exc()
发生异常时,Python能“记住”引起的异常以及程序的当前状态。Python还维护着traceback(跟踪)对象,其中含有异常发生时与函数调用堆栈有关的信息。记住,异常可能在一系列嵌套较深的函数调用中引起。程序调用每一个函数时,Python会在“函数调用堆栈”的起始处插入函数名。一旦异常被引起,Python会搜索一个相应的异常处理程序。若是当前函数中没有异常处理程序,当前函数会终止执行,Python会搜索当前函数的调用函数,并以此类推,直到发现匹配的异常处理程序,或者Python抵达主程序为止。这一查找合适的异常处理程序的过程就称为“堆栈展转开解”(Stack Unwinding)。解释器一方面维护着与放置堆栈中的函数有关的信息,另外一方面也维护着与已从堆栈中“展转开解”的函数有关的信息。code
方法三:采用sys模块回溯最后的异常对象
#引入sys模块 import sys try: a=b b=c except: info=sys.exc_info() print info[0],":",info[1]
sys.exc_info()的返回值是一个tuple, (type, value/message, traceback)io
这里的type ---- 异常的类型import
value/message ---- 异常的信息或者参数file
traceback ---- 包含调用栈信息的对象。
从这点上能够看出此方法涵盖了traceback.
可是,若是你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:
把 traceback.print_exc() 打印在屏幕上的信息保存到一个文本文件中
import traceback try: a=b b=c except: f=open("c:log.txt",'a') traceback.print_exc(file=f) f.flush() f.close()
不管try是否发生异常,finally总会执行
def catcher(): try: ... finally: print 'after fecth'
finally执行的顺序和java中的同样。
try无异常,才会执行else
def catcher(): try: ... except: print "got exception" else: print "not exception"
利用raise传递异常
def catcher(): try: ... except: print "got exception" raise
raise语句不包括异常名称或额外资料时,会从新引起当前异常。若是但愿捕获处理一个异常,而又不但愿异常在程序代码中消失,能够经过raise从新引起该异常。
except(name1, name2)
def catcher(): try: fetcher(x, 4) except(TypeError, IndexError): print "got exception" else: print "not exception"
捕获列表列出的异常,进行处理。若except后无任何参数,则捕获全部异常。