天天看點

學學python(2):錯誤和異常

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>

上一篇: 正規表達式