錯誤和異常
錯誤和異常在程序設計中是兩個不同的概念。這兩個概念又有著密切聯系。
錯誤是客觀存在的一個現象。錯誤就在那里,不聲不響。
錯誤分為語法錯誤和邏輯錯誤。
語法錯誤是靜態的,編譯/解釋程序會發現這些語法錯誤,并輔助我們糾正這些語法錯誤。
邏輯錯誤動態的,是運算邏輯不完整不正確,會導致程序運行失敗。
異常是一種手段措施,是系統發現程序運行出錯后,為避免程序失敗,中斷正??刂屏鞒滩⒉扇〉拇胧?。這個措施分為兩個階段:首先發布錯誤信息(拋出異常),其次處理這個錯誤并采取相應的操作。
在Python語言中所說異常還表示異常對象,就是將錯誤發生時的狀態信息封裝為一個對象。我們所謂拋出異常就是生成這個異常對象并讓這個對象能被訪問。異常對象一般是由系統拋出,但也可以由程序主動拋出。
try- except 語句:
try:
normal code piece # 系統會監控這段代碼是否有錯誤發生,如果有會拋出相應的異常對象。
exceptException[, reason]: #程序可以捕獲指定異常對象并做進一步的處理。
except code piece # 捕獲異常后的處理代碼。
說明:
reason將會是一個包含來自導致異常的代碼的診斷信息的類實例. 異常參數自身會組成一個元組,并存儲為類實例(異常類的實例)的屬性. 上邊的第一種用法中, reason 將會是一個Exception 類的實例. 對于大多內建異常, 也就是從 StandardError 派生的異常, 這個元組只包含一個指示錯誤原因的字符串. 一般說來, 異常的名字已經是一個滿意的線索了, 但這個錯誤字符串會提供更多的信息. 操作系統或其他環境類型的錯誤, 例如 IOError , 元組中會把操作系統的錯誤編號放在錯誤字符串前. 無論 reason 只包含一個字符串或是由錯誤編號和字符串組成的元組, 調用 str(reason) 總會返回一個良好可讀的錯誤原因. 不要忘記 reason 是一個類實例 - 這樣做你其實是調用類的特殊方法 __str__() . 我們將在第 13 章探索面向對象編程中的這些特殊方法. 唯一的問題就是某些第三方或是其他外部庫并不遵循這個標準協議. 我們推薦你在引發你自己的異常時遵循這個標準(參見核心風格筆記).
擴展支持:
1. 多個excption子句依次捕獲不同的異常。
except ValueError:
retval = 'could not convert non-number tofloat'
except TypeError:
retval = 'object type cannot be convertedto float'
2. 一個exception子句中捕獲多個不同的異常。要求異常被放在一個元組里:
except (Exception1, Exception2)[, reason]:
3. 捕獲所有異常:
except Exception, e: 或者 except: (裸except子句)
4. else子句當沒有異常發生時運行。
5. finally子句無論如何都會被運行。
完整的異常處理的語法模板:
try:
try_suite
except Exception1:
suite_for_Exception1
except (Exception2,Exception3, Exception4):
suite_for_Exceptions_2_3_and_4
except Exception5,Argument5:
suite_for_Exception5_plus_argument
except (Exception6,Exception7), Argument67:
suite_for_Exceptions6_and_7_plus_argument
except:
suite_for_all_other_exceptions
else:
no_exceptions_detected_suite
finally:
always_execute_suite
主動拋出異常:
raise[SomeException [, args [, traceback]]], 參數說明如下:
第一個參數,SomeExcpetion,是觸發異常的名字.如果有,它必須是一個字符串,類或實例.
第二個符號為可選的 args(比如參數,值),來傳給異常.這可以是一個單獨的對象也可以是一個對象的元組.當異常發生時,異常的參數總是作為一個元組傳入.如果 args 原本就是元組,那么就將其傳給異常去處理;如果 args 是一個單獨的對象,就生成只有一個元素的元組(就是單元素元組).
最后一項參數,traceback,同樣是可選的(實際上很少用它),如果有的話,則是當異常觸發時新生成的一個用于異常-正?;?exception—normally)的追蹤(traceback)對象.
斷言拋出異常:
斷言對一個條件表達式進行判斷。正常應返回真,如果運行時該條件表達式為假則拋出斷言異常AssertionError. 語法如下:
assert exPRession[,arguments]
AssertionError 異常和其他的異常一樣可以用 try-except語句塊捕捉,但是如果沒有捕捉,它將終止程序運行而且提供一個traceback:
Traceback(innermost last): File "<stdin>", line 1, in ?
AssertionError
對于斷言觸發的異常AssertError,可以提供一個參數,捕獲這個斷言異常的exception子句中的args可以獲取這個參數。
try:
assert 1 == 0, 'One does not equal zerosilly!'
except AssertionError,args:
print '%s: %s' % (args.__class__.__name__,args)
從命令行執行上面的代碼會導致如下的輸出:
AssertionError: Onedoes not equal zero silly!
常見內建異常:
異常名稱 描述
BaseException 所有異常的基類
SystemExit python 解釋器請求退出
KeyboardInterrupt 用戶中斷執行(通常是輸入^C)
Exception 常規錯誤的基類
StopIteration 迭代器沒有更多的值
GeneratorExit 生成器(generator)發生異常來通知退出
SystemExit Python 解釋器請求退出
StandardError 所有的內建標準異常的基類
ArithmeticError 所有數值計算錯誤的基類
FloatingPointError 浮點計算錯誤
OverflowError 數值運算超出最大限制
ZeroDivisionError 除(或取模)零 (所有數據類型)
AssertionError 斷言語句失敗
AttributeError 對象沒有這個屬性
EOFError 沒有內建輸入,到達 EOF 標記
EnvironmentError 操作系統錯誤的基類
IOError 輸入/輸出操作失敗
OSError 操作系統錯誤
WindowsError Windows 系統調用失敗
ImportError 導入模塊/對象失敗
KeyboardInterrupt 用戶中斷執行(通常是輸入^C)
LookupError 無效數據查詢的基類
IndexError 序列中沒有沒有此索引(index)
KeyError 映射中沒有這個鍵
MemoryError 內存溢出錯誤(對于 Python 解釋器不是致命的)
NameError 未聲明/初始化對象 (沒有屬性)
UnboundLocalErrorh 訪問未初始化的本地變量
ReferenceErrore 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
RuntimeError 一般的運行時錯誤
NotImplementedError 尚未實現的方法
SyntaxError Python 語法錯誤
IndentationError 縮進錯誤
TabError Tab 和空格混用
SystemError 一般的解釋器系統錯誤
TypeError 對類型無效的操作
ValueError 傳入無效的參數
UnicodeError Unicode 相關的錯誤
UnicodeDecodeError Unicode 解碼時的錯誤
UnicodeEncodeError Unicode 編碼時錯誤
UnicodeTranslateError Unicode 轉換時錯誤
Warning j 警告的基類
DeprecationWarning 關于被棄用的特征的警告
FutureWarning 關于構造將來語義會有改變的警告
OverflowWarning 舊的關于自動提升為長整型(long)的警告
PendingDeprecationWarning 關于特性將會被廢棄的警告
RuntimeWarning 可疑的運行時行為(runtimebehavior)的警告
SyntaxWarning 可疑的語法的警告
UserWarning 用戶代碼生成的警告
自定義異常:
def class <SelfExceptionName>(<BaseExceptionName>):
pass
自定義一個繼承了BaseExcetpton的異常類,什么也不做。對與自定義異常,只能通過raise語句拋出。
異常發生時,sys.exc_info() 函數可以獲取當前的異常信息。返回一個三元組(exc_type,exc_value,exc_traceback)
新聞熱點
疑難解答