Python的異常處理機制


1.錯誤和異常

錯誤   指的是代碼的語法或者邏輯有錯誤

異常  指的是 由錯誤引起的,當出現錯誤,python解釋器就無法處理程序,報出異常

出現異常,程序終止執行,如果不加以處理(異常捕捉),就會出現所謂的traceback 回溯 終止程序

2.python的異常處理

使用 python 異常處理機制,遇見異常,不會拋出不友好的traceback,而是有except決定拋出的信息

python的錯誤處理機制讓你能夠細致的控制與用戶分享錯誤信息的程度,要分享多少信息由你決定。

1.try/except

def main(): a=3/0 print(a) try: main() except ZeroDivisionError: print("error")  

 try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理,如果沒有try/except,程序發生錯誤會終止運行,且拋出不友好的traceback,有了該語句,try語句發生錯誤,只會打印出“error”提示。

except捕捉 ZeroDivisionError 異常,也可以捕捉多種異常  except(Exception1[, Exception2[,...ExceptionN]]]):

except也可以不帶任何異常類型,意味着只要try有錯,就執行except后面的語句,但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息,因為它捕獲所有的異常。

def main(): a=3/0 print(a) try: main() except: print("error") 

 2.try/except/else/finally

def main(): a=3/1
    print(a) try: main() except ZeroDivisionError: print("error") else: print(main()) finally: print("always do this")

try語句內容有錯,執行except語句,沒有錯誤,執行else語句

3. 拋出異常 raise

python使用raise 語句 拋出一個指定的異常

raise NameError(“hello”)

有了raise 語句 就有異常,不管程序有沒有異常,raise出現的地方就是異常 

def is_work_done(): a=3/1
    return a try: is_work_done() raise NameError("HELLO") except: print("hello") raise #raise的唯一參數是異常的類或者實例(也就是exception的子類)
如果你只想知道這是否拋出了一個異常,並不想去處理它,那么一個簡單的 raise 語句就可以再次把它拋出。

 4 . 自定義異常類型

你可以通過創建一個新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承,例如:

class MyError(Exception): def __init__(self,value): super().__init__() self.value=value try: raise MyError(9) except MyError as e: print(e.value)

5. Exception 和 BaseException區別

BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration... +-- StandardError... +-- Warning...

可以看出  BaseException 是最最基礎的異常類,Exception 繼承他,BaseException除了包含所有的Exception外還包含了SystemExitKeyboardInterruptGeneratorExit三個異常。這三個高級異常很少使用,我們在處理常見異常,只需要基於Exception即可。

6.  except Exception as e和 except Exception, e

兩者意思相同 第一種寫法推薦使用,第二種 python3 不支持

7. 常見的異常類型

  描述
BaseError 所有異常的基類
SystemExit 解釋器請求退出
KeyBoardInterrupt 用戶中斷執行(ctrl+c)
Exception 常規錯誤的基類
AssertionError 斷句錯誤,當assert關鍵字后面的條件為假時,程序就會拋出
FileNotFoundError 文件不存在
AttributeError 屬性錯誤,對象屬性不存在的時候
IndexError 索引錯誤,索引超出范圍
KeyError 在字典中查找一個不存在的關鍵字
NameError 嘗試訪問一個不存在的變量
SyntaxError 語法錯誤
TypeError 類型錯誤,不同類型間的無效操作,1+“1”
ZeroDivisionError 除0錯誤,分母為0
EOFError 沒有內建輸入,到達EOF標記
IOError 輸入/輸出操作失敗
OSError 操作系統錯誤
WindowsError 系統調用失敗
RuntimeError 一般的運行時錯誤
IndentationError 縮進錯誤
SystemError 一般的解釋器錯誤
TabError

Tab和空格混用

Warning

所有警告的基類

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8. 注意事項

  1. 只處理你知道的異常,避免捕獲所有異常然后吞掉它們。
  2. 拋出的異常應該說明原因
  3. 如果有需要,切記使用finally來釋放資源
  4. 如果有需要,請不要忘記在處理異常后做清理工作或者回滾操作

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM