Python異常

  異常是一個事件,該事件會在程序執行過程中發生,將影響程序的正常執行。一般情況下,在Python無法正常處理程序時就會發生一個異常。異常是Python對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。

異常處理

  Python中捕捉異常可以使用try/except語句。try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。如果你不想在異常發生時結束你的程序,只需在try裏捕獲它。基本語法如下:

try:
<語句>        #程序的代碼
except <名字>:
<語句>        #如果在try部分引發了異常將執行該段語句
except <名字>,<數據>:
<語句>        #如果引發了異常,將獲得附加的數據
else:
<語句>        #如果沒有異常發生執行該段語句
finally:
<語句>        #不論程序是否存在異常都將執行該語句

  python的標準異常類有如下列表:

BaseException所有異常的基類
SystemExit解釋器請求退出
KeyboardInterrupt用戶中斷執行
Exception常規錯誤的基類

StopIteration

迭代器沒有更多的值
GeneratorExit生成器(generator)發生異常來通知退出
StandardError所有的內建標準異常的基類
ArithmeticError所有數值計算錯誤的基類
FloatingPointError浮點計算錯誤
OverflowError數值運算超出最大限制

ZeroDivisionError

除(或取模)零 (所有數據類型)
AssertionError斷言語句失敗
AttributeError對象沒有這個屬性
EOFError沒有內建輸入,到達EOF 標記
EnvironmentError操作系統錯誤的基類
IOError輸入/輸出操作失敗
OSError操作系統錯誤
WindowsError系統調用失敗
ImportError導入模塊/對象失敗
LookupError無效數據查詢的基類
IndexError序列中沒有此索引(index)
KeyError映射中沒有這個鍵
MemoryError內存溢出錯誤(對於Python 解釋器不是致命的)
NameError未聲明/初始化對象 (沒有屬性)
UnboundLocalError訪問未初始化的本地變量
ReferenceError弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
RuntimeError一般的運行時錯誤
NotImplementedError尚未實現的方法
SyntaxErrorPython 語法錯誤
IndentationError縮進錯誤
TabErrorTab和空格混用
SystemError一般的解釋器系統錯誤
TypeError對類型無效的操作
ValueError傳入無效的參數
UnicodeErrorUnicode 相關的錯誤
UnicodeDecodeErrorUnicode 解碼時的錯誤
UnicodeEncodeErrorUnicode 編碼時錯誤
UnicodeTranslateErrorUnicode 轉換時錯誤
Warning警告的基類
DeprecationWarning關於被棄用的特徵的警告
FutureWarning關於構造將來語義會有改變的警告
OverflowWarning舊的關於自動提升爲長整型(long)的警告
PendingDeprecationWarning關於特性將會被廢棄的警告

RuntimeWarning

可疑的運行時行爲(runtime behavior)的警告
SyntaxWarning可疑的語法的警告
UserWarning用戶代碼生成的警告

  下面舉例:在文件中寫入內容

import codecs
try:
   with codecs.open('file.txt', 'w') as fh:
       fh.write("This is a test file for testing exceptions!")
except IOError as err:
   print 'ERROR: Failed to find file or read file'
else:
   print 'Write content successful'
finally:
   print 'Program end'
   
運行結果:
Write content successful
Program end

  上面程序中IOError是用於文件操作輸入\輸出失敗異常類,可以看出沒有拋出異常,爲了演示異常運行,這裏將file.txt文件設置爲只讀,下面運行程序結果是:

運行結果:
ERROR: Failed to find file or read file
Program end

  這樣我們就很清晰地看出異常處理的機制了,try獲取異常後去匹配except語句,匹配成功後異常處理結束,如沒有發生異常將匹配else語句,程序結束;但不管程序是否拋出異常finally語句始終會被執行。 

  try的工作原理是,當開始一個try語句後,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這裏,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。

(1)如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常);

(2)如果在try後的語句裏發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印缺省的出錯信息);

(3)如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句;

觸發異常

  Python中我們可以使用raise語句自己觸發異常,語法格式如下:

raise [Exception [, args [, traceback]]]

  第一個參數,Exception必須是一個異常類,或異常類的實例;

  第二個參數是傳遞給Exception的參數,必須是一個元組。這個參數用來傳遞關於這個異常的有用信息;

  第三個參數traceback很少用,主要是用來提供一個跟中記錄對象;

  語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是"None"。最後一個參數是可選的,如果存在,是跟蹤異常對象。這裏還是用上面的例子,如下:

import codecs
try:
   with codecs.open('file.txt', 'w') as fh:
       fh.write("This is a test file for testing exceptions!")
except IOError as err:
   raise err
   print 'ERROR: Failed to find file or read file'
else:
   print 'Write content successful'
finally:
   print 'Program end'
   
運行結果:
Traceback (most recent call last):
Program end
 File "C:/Users/YangQing/PycharmProjects/Test/except.py", line 11, in <module>
   raise err
IOError: [Errno 13] Permission denied: 'file.txt'

  從raise拋出異常可以看出下面的代碼都沒有執行,拋出異常後程序直接結束運行。

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