1. python中有很多中異常,比如使用沒有申請的變量會為NameError,文法不對為SyntaxError,請求的索引超出序列範圍為IndexError。
2. 異常處理:主要有兩種形式try-except和try-finally,我們隻能使用其中的一種,一個try語句可以對應一個或多個except子句,但隻能對應一個finally子句或是一個try-except-finally複合語句。
Try-except-else:檢測和處理異常,else子句處理沒有探測到異常時執行的代碼。
try-finally:檢測并做一些必要的清除工作。
try-except-finally:上面兩者都可以做到。
下面舉個例子說明,我們寫一個轉換為整數的函數,如下:
def ConInt(obj):
try:
result=int(obj)
except ValueError:
result="could not convert"
except TypeError:
result='type is wrong'
return result
下面是函數調用:
>>> ConInt('asd')
'could not convert'
>>> ConInt([1,2])
'type is wrong'
我們也可以在一個except中處理多個異常,将異常寫為元組的形式如下
except (ValueError,TypeError):
result="could not convert"
3. 異常參數,可以攜帶更詳細的異常資訊,該參數以元組的方式放在except後面,下面是例子。
>>> def ConInt(obj):
... try:
... result=int(obj)
... except (ValueError,TypeError),diag:
... result=str(diag)
... return result
...
"invalid literal for int() with base 10: 'asd'"
>>> ConInt([1,3])
"int() argument must be a string or a number, not 'list'"
4. With語句:隻工作于支援上下文管理協定的對象。比如file對象就支援,那我們就可以使用wirh,如下:
With open(‘test.txt’,’r’) as f:
For eachLine in f:
# do something
該段代碼會視圖打開一個檔案,然後周遊檔案中的每一行,完成後關閉檔案,使用with的好處是這段代碼無論哪裡發生了異常,都會執行清理的代碼,檔案會被自動關閉。和使用try-finally是一樣的。
5. 觸發異常
使用raise[SomeException[,args [,traceback]]]語句來觸發異常。
參數SomeException為觸發異常的名字,必須是字元串,類或執行個體。
參數args為可選,訓示錯誤原因的元組。
參數traceback,可選,當異常觸發時新生成一個用于異常-正常話的追蹤對象,當你想重新引發異常時,該參數很有用,可以用來差別先前和目前的位置,如果沒有寫None。
6.可以通過sys子產品中exc_info函數來擷取異常資訊,如下:
>>> try:
... int('asdf')
... except:
... import sys
... exc_tuple=sys.exc_info()
>>> print exc_tuple
(<type 'exceptions.ValueError'>, ValueError("invalid literal for int() with base 10: 'asdf'",), <traceback object at 0x0164B6E8>)
>>> for item in exc_tuple:
... print item
...
<type 'exceptions.ValueError'>
invalid literal for int() with base 10: 'asdf'
<traceback object at 0x0164B6E8>
從後面的for中我們可以看出得到的異常元組包括三項資訊,分别表示異常類,異常類的執行個體和追蹤對象。
7. 下圖為python異常的繼承體系結構:
<a href="http://images.cnblogs.com/cnblogs_com/carysun/WindowsLiveWriter/python2_13A13/clip_image002_2.jpg"></a>