[TOC]
# 异常处理
Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系看这里:
https://docs.python.org/2/library/exceptions.html#exception-hierarchy
## 语法
~~~ python
try:
pass
except:
pass
finally:
pass
==========
例:
==========
try:
print 10 / 0
except Exception, e:
print e
finally:
print 'finally...'
~~~
* 如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。
~~~ python
=============================
异常会被Python解释器捕获
=============================
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
>>> main()
~~~
## 自定义异常类
* 语法:
➣ ` class CustomException(Exception): pass`
* 向其他类一样,只要确保从Exception类继承(不管是间接还是直接的,就是说继承其他的内建异常类也可以)
## 多个Except
~~~ python
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x / y
except ZeroDivisionError:
print 'ZeroDivisionError...'
except TypeError:
print 'TypeError...'
# 或
except (ZeroDivisionError, TypeError):
print 'Error Message...'
~~~
## 获取异常的对象 e
~~~ python
try:
print 1 / 0
except (ZeroDivisionError, TypeError), e:
print 'Error Message: ', e
~~~
## 给try/except添加else语句
**else中的语句**只有在**没有异常**发生的时候**才会执行**
* 语法:
~~~ python
try:
except:
else:
finally:
~~~
~~~ python
============================================================
例:
输入不正确会引异常,程序就会不断要求输入
输入正确没有异常,就会执行else中的语句,结束程序
============================================================
while True:
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x / y
except:
print 'Invalid input,please try again!'
else:
break
finally:
print 'exec finally...'
~~~
## raise关键字
将异常抛向上层调用处
~~~ python
def cacl():
try:
print 1 / 0
except:
raise Exception('Something is wrong!') # 从此处抛出异常到标记二处
def exec_cacl():
cacl() # 标记二 此处将异常继续外抛至标记三处
# 标记三 此处异常未做处理,程序强制终止
>>> exec_cacl()
# 下面代码给调用exec_cacl函数添加了异常捕捉优化处理
# 程序捕捉到异常后,会继续向下执行,不会强制终止程序
try:
exec_cacl()
except Exception, e:
print 'exec_cacl errorInfo: ', e
~~~