python提供的異常處理
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出異常;基本上是無法打開文件
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(個人認爲這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量,
導致你以爲正在訪問它
ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
try....except格式如下
- try:
- print("邏輯處理代碼塊")
- except Exception as e:
- print("代碼塊執行錯誤異常", e)
- #在測試時,當程序跑完後沒有出錯,可以用這個顯示
- else:
- print("邏輯代碼塊執行無錯誤執行此部分")
- finally:
- print("無論有無錯誤都執行的代碼塊部分")
如上所示, python的異常捕獲時調用了Exception類, 這個是一個異常的基類,e爲異常的一個對象類似於
e = Exception()
finally 意義:
例:當ftp服務器斷開連接後,可以執行清楚緩存數據工作
但是我們知道,這樣實例化後的 e 應該是一個對象, 如果執行print(e)應該是一個內存地址纔對,比如:
- class A():
- pass
- a = A()
- print(a)
- 結果:
- <__main__.A object at 0x00000000031ACE48>
那爲什麼當我們調用print(e)時返回了一個錯誤信息呢。
讓我們看看下面的例子:
- class A():
- def __init__(self):
- pass
- def __str__(self):
- return "class A str function"
- a = A()
- print(a)
- 結果:
- class A str function
沒錯,當給類增加一個__str__函數後,當print(a) 就不再是內存地址了,而是自動調用了 __str__函數。所以異常處理時 print(e) 也是調用了 Exception的__str__函數。
assert 《》判斷一個條件是否成立。必要的條件不滿足,不會往下執行。
明確的告訴別人,這條語句是至關重要的。
raise 異常
我們在使用 try...exception 語句執行代碼的過程中,系統出現異常後會將錯誤信息返回給 變量e,看下面例子:
- a = 1
- b = 2
- try:
- c = a + b
- if c == 4:
- print(c)
- else:
- raise Exception("出錯了")
- except Exception as e:
- print(e)
- 結果:
- 出錯了
沒錯,通過raise我們可以將錯誤信息通過Except類返回給e,這樣就能輸出我們自定義的錯誤信息了,是不是方便看了。既然這樣,我們可以自定義一個類
自定義異常
看下面的例子:
- class MyException(Exception):
- CODE1 = "10000" # 用戶名密碼錯誤
- CODE2 = "10001" # 用戶不存在
- def __init__(self, error_msg):
- self._msg = error_msg
- def __str__(self):
- if self._msg == "10000":
- return "用戶名密碼錯誤"
- if self._msg == "10001":
- return "用戶不存在"
- if __name__ == "__main__":
- user = input("用戶名:")
- pwd = input("密碼:")
- try:
- if user == "peter":
- if pwd == "12345":
- print("登錄成功")
- else:
- raise MyException("10000")
- else:
- raise MyException("10001")
- except MyException as e:
- print(e)