Python 系列之 - 異常處理

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格式如下

[python] view plain copy
  1. try:  
  2.     print("邏輯處理代碼塊")  
  3.   
  4. except Exception as e:  
  5.     print("代碼塊執行錯誤異常", e)  
  6.     #在測試時,當程序跑完後沒有出錯,可以用這個顯示
  7. else:  
  8.     print("邏輯代碼塊執行無錯誤執行此部分")  
  9.   
  10. finally:  
  11.     print("無論有無錯誤都執行的代碼塊部分")  

如上所示, python的異常捕獲時調用了Exception類, 這個是一個異常的基類,e爲異常的一個對象類似於

e = Exception()

finally 意義:

例:當ftp服務器斷開連接後,可以執行清楚緩存數據工作

但是我們知道,這樣實例化後的 e 應該是一個對象, 如果執行print(e)應該是一個內存地址纔對,比如:

[python] view plain copy
  1. class A():  
  2.     pass  
  3.   
  4. a = A()  
  5. print(a)  
  6. 結果:  
  7. <__main__.A object at 0x00000000031ACE48>  

那爲什麼當我們調用print(e)時返回了一個錯誤信息呢。

讓我們看看下面的例子:

[python] view plain copy
  1. class A():  
  2.     def __init__(self):  
  3.         pass  
  4.   
  5.     def __str__(self):  
  6.         return "class A str function"  
  7.   
  8. a = A()  
  9. print(a)  
  10.   
  11. 結果:  
  12. class A str function  

沒錯,當給類增加一個__str__函數後,當print(a) 就不再是內存地址了,而是自動調用了 __str__函數。所以異常處理時 print(e) 也是調用了 Exception的__str__函數。


assert  《》判斷一個條件是否成立。必要的條件不滿足,不會往下執行。

明確的告訴別人,這條語句是至關重要的。

raise 異常

我們在使用 try...exception 語句執行代碼的過程中,系統出現異常後會將錯誤信息返回給 變量e,看下面例子:

[python] view plain copy
  1. a = 1  
  2. b = 2  
  3. try:  
  4.     c = a + b  
  5.     if c == 4:  
  6.         print(c)  
  7.     else:  
  8.         raise Exception("出錯了")  
  9. except Exception as e:  
  10.     print(e)  
  11. 結果:  
  12. 出錯了  

沒錯,通過raise我們可以將錯誤信息通過Except類返回給e,這樣就能輸出我們自定義的錯誤信息了,是不是方便看了。既然這樣,我們可以自定義一個類


自定義異常

看下面的例子:

[python] view plain copy
  1. class MyException(Exception):  
  2.     CODE1 = "10000"  # 用戶名密碼錯誤  
  3.     CODE2 = "10001"  # 用戶不存在  
  4.   
  5.     def __init__(self, error_msg):  
  6.         self._msg = error_msg  
  7.   
  8.     def __str__(self):  
  9.         if self._msg == "10000":  
  10.             return "用戶名密碼錯誤"  
  11.         if self._msg == "10001":  
  12.             return "用戶不存在"  
  13.   
  14. if __name__ == "__main__":  
  15.     user = input("用戶名:")  
  16.     pwd = input("密碼:")  
  17.     try:  
  18.         if user == "peter":  
  19.             if pwd == "12345":  
  20.                 print("登錄成功")  
  21.             else:  
  22.                 raise MyException("10000")  
  23.         else:  
  24.             raise MyException("10001")  
  25.     except MyException as e:  
  26.         print(e)                                                                                                                          
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章