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
外還包含了SystemExit
,KeyboardInterrupt
和GeneratorExit
三個異常。這三個高級異常很少使用,我們在處理常見異常,只需要基於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. 注意事項
- 只處理你知道的異常,避免捕獲所有異常然后吞掉它們。
- 拋出的異常應該說明原因
- 如果有需要,切記使用
finally
來釋放資源 - 如果有需要,請不要忘記在處理異常后做清理工作或者回滾操作