python 错误处理 (转)
python 异常处理 (转)一)捕获异常格式一:try:??? 语句except 异常1:??? 语句except 异常2:??? 语
python 异常处理 (转)
一)捕获异常
格式一:
try:
??? <语句>
except <异常1>:
??? <语句>
except <异常2>:
??? <语句>
else:???????????如果没有异常,则执行else块中的语句
??? <语句>
格式二:
try:
??? <语句>
finally:
??? <语句>
不管try语句块中是否发生异常,都将执行finally语句块。
[python] view plaincopy
- >>>?l?=?[1,2,3]??>>>?l[5]??
- Traceback?(most?recent?call?last):????File?"<stdin>",?line?1,?in?<module>??
- IndexError:?list?index?out?of?range??>>>?try:??
- ...?????l[5]??...?????except:???#此处未使用异常名,表示捕获所有异常??
- ??File?"<stdin>",?line?3??????except:???#此处未使用异常名,表示捕获所有异常??
- ?????????^??SyntaxError:?invalid?syntax??
- >>>?try:??...?????l[5]??
- ...?except:????#此处未使用异常名,表示捕获所有异常??...?????print?'Error'??
- ...?else:??...?????print?'No?error'??
- ...??Error??
- >>>?try:??...?????l[2]??
- ...?except:??...?????print?'error'??
- ...?else:??...?????print?'No?error'??
- ...??3??
- No?error??>>>?try:??
- ...?????l[2]??...?finally:??
- ...?????print?'a'??...??
- 3??a??
- >>>?try:??...?????l[5]??
- ...?finally:??...?????print?'a'??
- ...??a??
- Traceback?(most?recent?call?last):????File?"<stdin>",?line?2,?in?<module>??
- IndexError:?list?index?out?of?range??>>>??
?
二)处理异常:
AttributeError: 调用不存在的方法引发的异常
EOFError: 遇到文件末尾引发的异常
ImportError: 导入模块出错引发的异常
IndexError: 列表越界引发的异常
IOError: I/O 操作引发的异常,如打开文件出错等
KeyError:使用字典中不存在的关键字引发的异常
NameError:使用不存在的变量名引发的异常
TabError: 语句块缩进不正确引发的异常
ValueError: 搜索列表中不存在的值引发的异常
ZeroDivisionError: 除数为零引发的异常
?
except语句主要有以下几种用法:
except:????? 捕获所有异常
except? <异常名>:
except? <异常名1,异常名2>:? 捕获异常名1或者异常名2
except? <异常名>, <数据>: 捕获指定异常及附加的数据
except? (异常名1,异常名2), <数据>:? 捕获异常名1或者异常名2及异常的附加数据
[python] view plaincopy
- >>>?l?=?[1,2,]??>>>?try:??
- ????l[5]??except?IndexError,Error??
- SyntaxError:?invalid?syntax??>>>?l?=?[1,2,3]??
- >>>?try:??????l[5]??
- except?IndexError,errorMessage:??????print?errorMessage??
- else:??????print?'No?Error'??
- ????????
- list?index?out?of?range??>>>?try:??
- ????l[2]/0??except?(IndexError,ZeroDivisionError):?#捕获IndexError异常或者ZeroDivisionError异常??
- ????print?'Error'??else:??
- ????print?'No?error'????
- ??????Error??
- >>>?try:??????l[5]?/?0??
- except:??????print?'Error'??
- else:??????print?'No?error'??
- ????????
- Error??>>>?try:??
- ????l[2]/0??except?(IndexError,ZeroDivisionError),value:???#捕获IndexError或ZeroDivisionError异常,及其附加数据??
- ????print?value????
- ??????integer?division?or?modulo?by?zero??
- >>>???
?
3)多重异常处理
如果except能够处理该异常,则外围的try语句将不会捕获异常。如果except忽略该异常,则异常将被外围try语句捕获。
[c-sharp] view plaincopy
- >>>?try:??...?????try:??
- ...?????????????l[5]??...?????except:??
- ...?????????????print?'error1'??...?except:??
- ...?????print?'error2'??...?else:??
- ...?????print?'no?error'??...??
- error1??no?error??
- >>>?try:??...?????try:??
- ...?????????????l[1]/0??...?????except?IndexError:??
- ...?????????????print?'error1'??...?except:??
- ...?????print?'error2'??...?else:??
- ...?????print?'no?error'??...??
- error2??>>>?try:??
- ...?????try:??...?????????????l[1]/'s'??
- ...?????except?IndexError:??...?????????????print?'error1'??
- ...?except?ZeroDivisionError:??...?????print?'error2'??
- ...?else:??...?????print?'no?error'??
- ...??Traceback?(most?recent?call?last):??
- ??File?"<stdin>",?line?3,?in?<module>??TypeError:?unsupported?operand?type(s)?for?/:?'int'?and?'str'??
- >>>??
?
二)引发异常:
在python中可以通过使用raise语句手工引发异常。在类中也可以使用raise引发异常,并向异常传递数据。使用raise可以定义新的错误类型,以适应脚本的需要。
?
[python] view plaincopy
- >>>?class?A:??????def?show(self):??
- ????????print?'A'????
- ??????????>>>?try:??
- ????raise?A??except?A:??
- ????print?'error'??else:??
- ????print?'No?error'????
- ??????error??
- >>>???
?
自定义异常类:
[python] view plaincopy
- >>>?class?MyError(Exception):??????def?__init__(self,data):?????#重载__init__方法??
- ????????self.data?=?data??????def?__str__(self):??
- ????????return?self.data?????#重载__str__方法????
- ??????>>>?raise?MyError,'error'??
- ??Traceback?(most?recent?call?last):??
- ??File?"<pyshell#110>",?line?1,?in?<module>??????raise?MyError,'error'??
- MyError:?error??>>>?try:??
- ????raise?MyError,'raise?MyError'??except?MyError,data:??
- ????print?data??else:??
- ????print?'no?error'????
- ??????raise?MyError??
- >>>??
?
原文章地址:http://blog.csdn.net/guopengzhang/article/details/5455341?
?