python異常處理

#!/usr/bin/python

import traceback
try:
 1/0
#except Exception,e:
# print traceback.format_exc()
  
except Exception as e:
 print e

#!/usr/bin/python
import traceback
try:
 1/0
#except Exception,e:
# print traceback.format_exc()
  
except Exception , e:
 print e

       Python的異常處理能力是很強大的,可向用戶準確反饋出錯信息。在Python中,異常也是對象,可對它進行操作。所有異常都是基類Exception的成員。所有異常都從基類Exception繼承,而且都在exceptions模塊中定義。Python自動將所有異常名稱放在內建命名空間中,所以程序不必導入exceptions模塊即可使用異常。一旦引發而且沒有捕捉SystemExit異常,程序執行就會終止。如果交互式會話遇到一個未被捕捉的SystemExit異常,會話就會終止。

方式一:try語句:

1使用tryexcept語句來捕獲異常

try:
   block
except [exception,[data]]:
   block

try:
block
except [exception,[data...]]:
   block
else:
   block

該種異常處理語法的規則是:

·   執行try下的語句,如果引發異常,則執行過程會跳到第一個except語句。

·   如果第一個except中定義的異常與引發的異常匹配,則執行該except中的語句。

·   如果引發的異常不匹配第一個except,則會搜索第二個except,允許編寫的except數量沒有限制。

·   如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。

·   如果沒有發生異常,則執行else塊代碼。

:

try:

   f = open(file.txt,r)
except IOError, e:
   print e

捕獲到的IOError錯誤的詳細原因會被放置在對象e,然後運行該異常的except代碼塊

捕獲所有的異常

try:
   a=b
   b=c
except Exception,ex:
   print Exception,":",ex

使用except子句需要注意的事情,就是多個except子句截獲異常時,如果各個異常類之間具有繼承關係,則子類應該寫在前面,否則父類將會直接截獲子類異常。放在後面的子類異常也就不會執行到了。

2 使用tryfinally:

語法如下:

try:
   block
finally:
   block

該語句的執行規則是:

·   執行try下的代碼。

·   如果發生異常,在該異常傳遞到下一級try時,執行finally中的代碼。

·   如果沒有發生異常,則執行finally中的代碼。

第二種try語法在無論有沒有發生異常都要執行代碼的情況下是很有用的。例如我們在python中打開一個文件進行讀寫操作,我在操作過程中不管是否出現異常,最終都是要把該文件關閉的。

這兩種形式相互衝突,使用了一種就不允許使用另一種,而功能又各異

2. raise語句手工引發一個異常:

raise [exception[,data]]

Python中,要想引發異常,最簡單的形式就是輸入關鍵字raise,後跟要引發的異常的名稱。異常名稱標識出具體的類:Python異常是那些類的對象。執行raise語句時,Python會創建指定的異常類的一個對象。raise語句還可指定對異常對象進行初始化的參數。爲此,請在異常類的名稱後添加一個逗號以及指定的參數(或者由參數構成的一個元組)。

:

try:
    raise MyError #自己拋出一個異常
except MyError:
    print 'a error'

raise ValueError,invalid argument
捕捉到的內容爲:

type = VauleError
message = invalid argument

3.   採用traceback(跟蹤)模塊查看異常

      發生異常時,Python記住引發的異常以及程序的當前狀態。Python還維護着traceback(跟蹤)對象,其中含有異常發生時與函數調用堆棧有關的信息。記住,異常可能在一系列嵌套較深的函數調用中引發。程序調用每個函數時,Python會在函數調用堆棧的起始處插入函數名。一旦異常被引發,Python會搜索一個相應的異常處理程序。如果當前函數中沒有異常處理程序,當前函數會終止執行,Python會搜索當前函數的調用函數,並以此類推,直到發現匹配的異常處理程序,或者Python抵達主程序爲止。這一查找合適的異常處理程序的過程就稱爲堆棧輾轉開解Stack Unwinding)。解釋器一方面維護着與放置堆棧中的函數有關的信息,另一方面也維護着與已從堆棧中輾轉開解的函數有關的信息。

   格式:

try:
block
except:
   traceback.print_exc()

示例:excpetion/traceback.py

4. 採用sys模塊回溯最後的異常

import sys
try:
   block
except:
   info=sys.exc_info()
   print info[0],":",info[1]

或者以如下的形式:

import sys
    tp,val,td = sys.exc_info()

sys.exc_info()的返回值是一個tuple, (type, value/message, traceback)

這裏的type ---- 異常的類型

value/message ---- 異常的信息或者參數

traceback ---- 包含調用棧信息的對象。

從這點上可以看出此方法涵蓋了traceback.

5. 異常處理的一些其它用途

       除了處理實際的錯誤條件之外,對於異常還有許多其它的用處。在標準 Python 庫中一個普通的用法就是試着導入一個模塊,然後檢查是否它能使用。導入一個並不存在的模塊將引發一個 ImportError 異常。你可以使用這種方法來定義多級別的功能――依靠在運行時哪個模塊是有效的,或支持多種平臺 (即平臺特定代碼被分離到不同的模塊中)

       你也能通過創建一個從內置的 Exception 類繼承的類定義你自己的異常,然後使用 raise 命令引發你的異常。如果你對此感興趣,請看進一步閱讀的部分。

      下面的例子演示瞭如何使用異常支持特定平臺功能。代碼來自 getpass 模塊,一個從用戶獲得口令的封裝模塊。獲得口令在 UNIXWindows Mac OS 平臺上的實現是不同的,但是這個代碼封裝了所有的不同之處。

例支持特定平臺功能

# Bind the name getpass to the appropriate function

try:
      import termios, TERMIOS                    
except ImportError:
      try:
          import msvcrt                          
      except ImportError:
          try:
              from EasyDialogs import AskPassword
          except ImportError:
              getpass = default_getpass          
          else:                                  
              getpass = AskPassword
      else:
          getpass = win_getpass
else:
      getpass = unix_getpass

   

       termios UNIX 獨有的一個模塊,它提供了對於輸入終端的底層控制。如果這個模塊無效 (因爲它不在你的系統上,或你的系統不支持它),則導入失敗,Python 引發我們捕捉的 ImportError 異常。

   

       OK,我們沒有 termios,所以讓我們試試 msvcrt,它是 Windows 獨有的一個模塊,可以提供在 Microsoft Visual C++ 運行服務中的許多有用的函數的一個API。如果導入失敗,Python 會引發我們捕捉的 ImportError 異常。

   

如果前兩個不能工作,我們試着從 EasyDialogs 導入一個函數,它是 Mac OS 獨有的一個模塊,提供了各種各樣類型的彈出對話框。再一次,如果導入失敗,Python 會引發一個我們捕捉的 ImportError 異常。

   

       這些平臺特定的模塊沒有一個有效 (有可能,因爲 Python 已經移植到了許多不同的平臺上了),所以我們需要回頭使用一個缺省口令輸入函數 (這個函數定義在 getpass 模塊中的別的地方)。注意我們在這裏所做的:我們將函數 default_getpass 賦給變量 getpass。如果你讀了官方 getpass 文檔,它會告訴你 getpass 模塊定義了一個 getpass 函數。它是這樣做的:通過綁定 getpass 到正確的函數來適應你的平臺。然後當你調用 getpass 函數時,你實際上調用了平臺特定的函數,是這段代碼已經爲你設置好的。你不需要知道或關心你的代碼正運行在何種平臺上;只要調用 getpass,則它總能正確處理。

   

       一個 try...except 塊可以有一條 else 子句,就像 if 語句。如果在 try 塊中沒有異常引發,然後 else 子句被執行。在本例中,那就意味着如果 from EasyDialogs import AskPassword 導入可工作,所以我們應該綁定 getpass AskPassword 函數。其它每個 try...except 塊有着相似的 else 子句,當我們發現一個 import 可用時,就綁定 getpass 到適合的函數。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章