异常引发或会被传递给异常处理器,当前没有找到异常处理器,就会向上找直到找到为止,找到最顶层还是没找着的时候就会出错。
异常可以通过try语句来检测,任何在try语句块里的代码都会被监测,检查有无异常发生。
一、try-except
try:
try_suite #监控这里的异常
except Exception[,reason]: #reason作为代码异常的诊断信息,作为一个错误类的实例,通常用e表示
except_suit #异常处理代码
-----------------
try:
f=open('blah','r')
except IOError,e: #IOError一般为打开文件输入输出错误。若没有遇到错误,则解释器会忽略except语句继续执行
print 'could not open file:',e #一旦遇到IOError和e之后的处理方式,try下面的没有执行的剩余语句将被忽略
这里的语句只能处理IOError类型的错误,其他类型的不会处理,当遇到这个错误时,就会马上转向处理器中的代码,若找不到处理器那么异常就会向上移交给调用者,一直向上直到找到对应的处理器,否则就会报错
try:
xxx
except (ValueError,TypeError): #所有异常类型可以放在一个元祖里,进行统一处理
xxx
--------------------------
try:
xxxx
except ValueError:
xxx
except TypeError:
xxx
-----------------
try:
xxx
except Exception,e: #Exception是错误类里最顶层的类,其他例如TypeError等错误都是顶层之下的,所有Exception可以代表绝大多数错误类型,e属于错误日志
xxx
--------------
二、try-finally
当在try范围中产生一个异常时,会立即跳转到finally语句块,当finally中的所有代码都执行完毕后,会继续想上一层引发异常。
三、try-except-finally
try:
A
except MyException:B
else: C
finally:D
程序执行ACD或ABD
四、try-except-else
在try中的语句全部执行完后,没有引发异常,而走else语句
----------------------------------------------
try:
try_suite
except Exception1:
suite
except(Exception2,exception3):
suite
except Exception5,argument5:
suite
except (Exception6,Exception7),argument67:
suite
except:
suite
finally:
suite
with语句
with context_expr[as var]:
with_suite
with open('/etc/passwd','r') as f:
for eachLine in f:
#do sutff with eachline or f...
raise语句
raise [someException[,args[,traceback]]]
SomeException是触发异常的名字,它必须是一个字符串,类或实例。
args是参数、值,用来传给异常,通常是元祖形式
traceback追踪对象,如果没有就填写None