python 異常學習3---python異常except語句用法與引起異常

except: #捕獲全部異常python

except: <異常名>: #捕獲指定異常ios

except:<異常名1,異常名2):捕獲異常1或者異常2數據庫

except:<異常名>,<數據>:捕獲指定異常及其附加的數據編程

except:<異常名1,異常名2>:<數據>:捕獲異常名1或者異常名2,及附加的數據庫app

經常使用異常名:ide

異常名   描述
AttributeError 調用不存在的方法引起的異常
EOFError    遇到文件末尾引起的異常
ImportError 導入模塊出錯引起的異常
IndexError    列表越界引起的異常
IOError    I/O操做引起的異常,如打開文件出錯等
KeyError  使用字典中不存在的關鍵字引起的異常
NameError 使用不存在的變量名引起的異常
TabError 語句塊縮進不正確引起的異常
ValueError 搜索列表中不存在的值引起的異常
ZeroDivisionError  除數爲零引起的異常函數

使用raise 引起異常幾種方式:測試

raise 異常名
raise 異常名,附加數據
raise 類名spa

assert 簡化了raise語句:
須要注意的是,assert語句通常用於開發時對程序條件的驗證,只有當內置_debug_爲True時,assert語句纔有效。當Python腳本以-O選項編譯成爲字節碼文件時,assert 語句將被移除。
但與raise語句不一樣的是,assert語句是在條件測試爲假時,才引起異常。assert語言的通常形式以下:debug

assert <條件測試>,<異常附加數據> #其中異常附加數據是可選的

python編程_Python異常機制try: 代碼段 except 異常類型,e: 異常處理代碼段,若是不知道異常類型,可使用try: 代碼段 except Except,e:異常處理代碼段;Except是通用異常類型 

 

一個Python異常實例

 

一個簡單的異常例子,打開一個不存在的文件,引起異常:

#!/usr/local/bin/python3.2
try:
    f = open("file-not-exists", "r")
except IOError,e:
    print("open exception: %s: %s\n" %(e.errno, e.strerror))
與Python異常相關的關鍵字:
關鍵字          關鍵字說明
raise           拋出/引起異常
try/except      捕獲異常並處理
pass            忽略異常
as              定義異常實例(except IOError as e)
finally         不管是否出現異常,都執行的代碼
else            若是try中的語句沒有引起異常,則執行else中的語句
except
   老版本的Python,except語句寫做"except Exception, e",Python 2.6後應寫做"except Exception as e"。
使用
except
而不帶任何異常類型:
try:

     do something

except:

      handle except

    會捕獲全部異常,包括鍵盤中斷和程序退出請求(用sys.exit()就沒法退出程序了,由於異常被捕獲了),所以慎用。
使用
except Exception as e
。
 
 
else與finally
 
else表示若是try中的代碼沒有引起異常,則會執行else:
try:
    f = open("foo", "r")
except IOError as e:
    ...
else:
    data = f.read()
 
finally表示不管是否有異常,都將被執行:
try:
    f = open("foo", "r")
except IOError as e:
    ...
finally:
    f.close()

 

 

#!/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使用try和except語句來捕獲異常

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 使用try跟finally:

語法以下:

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 模塊,一個從用戶得到口令的封裝模塊。得到口令在 UNIX、Windows 和 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 到適合的函數。

相關文章
相關標籤/搜索