异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
在Java中使用try-catch来捕获异常,而在Python中类似,使用try-except来捕获发生的异常事件。基本结构如下:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
对于异常的种类,Python定义了很多标准异常,也可以自定义异常类。常见标准异常如下(详细见参考资料1):
异常名称 | 描述 |
Exception | 常规错误的基类 |
IOError | 输入/输出操作失败 |
ImportError | 导入模块/对象失败 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
下面来看一个例子:
try: i = int('a') except Exception, e: print 'str(Exception):\t', str(Exception) print 'str(e):\t\t', str(e) print 'repr(e):\t', repr(e) print 'e.message:\t', e.message print 'traceback.print_exc():'; traceback.print_exc() print 'traceback.format_exc():\n%s' % traceback.format_exc()
str(e)返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息。
repr(e)给出较全的异常信息,包括异常信息的类型,如1/0的异常信息。
e.message获得的信息同str(e)。
采用traceback模块,需要导入traceback模块(import traceback),此时获取的信息最全,与python命令行运行程序出现错误信息一致。使用traceback.print_exc()打印异常信息到标准错误,就像没有获取一样,或者使用traceback.format_exc()将同样的输出获取为字符串。你可以向这些函数传递各种各样的参数来限制输出,或者重新打印到像文件类型的对象。
这里需要注意的是:在 Python 3 Exception 的 except 子句中,不支持使用逗号 ',' 分隔 Exception 和 e,所以需要采用 as 关键词进行替换。另外,与 Python 2 Exception 类相比,Python 3 Exception 类没有 message 成员变量。针对这个问题,可以采用 sys.exc_info() 方法获取得到相关的异常信息。as 关键字以及 sys.exc_info() 方法对于 Python 2 同样适用。下面是Python3的写法:
except Exception as e: print('str(Exception):\t', str(Exception)) print('str(e):\t\t', str(e)) print('repr(e):\t', repr(e)) # Get information about the exception that is currently being handled exc_type, exc_value, exc_traceback = sys.exc_info() print('e.message:\t', exc_value) print("Note, object e and exc of Class %s is %s the same." % (type(exc_value), ('not', '')[exc_value is e])) print('traceback.print_exc(): ', traceback.print_exc()) print('traceback.format_exc():\n%s' % traceback.format_exc())
程序中的变量 e 和 exc_value 是同一个异常类型实例对象。exc_info() 方法可以获取正在处理的异常信息,即 except 子句正在处理的异常,其返回值为一个tuple类型的三元组(exc_type, exc_value, exc_traceback),其中,exc_type为获取到的异常类型;exc_value为该异常类型对象;exc_traceback为一个 traceback 对象,包含异常最初发生的调用栈信息。
参考资料: