目錄結構:html
python中的異常分爲運行時異常和語法異常,運行時異常發生在程序運行階段,而語法異常發生在解釋器檢查階段。該文章接下來所提到的異常都是運行時異常。python
下面是python中與異常相關的關鍵字linux
關鍵字 | 關鍵字說明 |
try/except | 捕獲異常說明 |
else | 若是try沒有捕獲到異常,則執行else的語句 |
finally | 不管是否出現異常,都執行代碼 |
下面將逐步講解這些關鍵字的使用。express
捕捉異常能夠使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。
若是你不想在異常發生時結束你的程序,只需在try裏捕獲它。
打開一個文件,在該文件中的內容寫入內容函數
try: fh = open("testfile", "w") fh.write("這是一個測試文件,用於測試異常!!") except IOError: print "Error: 沒有找到文件或讀取文件失敗" else: print "內容寫入文件成功" finally: fh.close()
你能夠不帶任何異常類型使用except,以下實例:測試
try: 正常的操做 ...................... except: 發生異常,執行這塊代碼 ...................... else: 若是沒有異常執行這塊代碼
以上方式try-except語句捕獲全部發生的異常。咱們能夠使用sys.exc_info()本身捕獲異常詳細信息,exc_info()的返回值是一個包含三個元素的Tuple(元組)數據類型。格式爲(type, value, traceback),其中type是被捕獲異常的類型(BaseException的派生類),value是異常實例(異常類型的實例),traceback是一個traceback對象(包含了異常拋出後的方法調用棧信息)
例如:this
import traceback import sys try: raise ValueError('this is a exp') except: ex_type, ex_val, ex_stack = sys.exc_info() print(ex_type) print(ex_val) for stack in traceback.extract_tb(ex_stack): print(stack)
try: 正常的操做 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 發生以上多個異常中的一個,執行這塊代碼 ...................... else: 若是沒有異常執行這塊代碼
案例:編碼
try: f1 = open("testfile.txt", "w+") f1.read() a = 1 / 0 except (IOError,ZeroDivisionError) as ercode: print("發生錯誤了,錯誤代碼爲:" + str(ercode)) else: print("內容寫入文件成功") f1.close()
try-finally 語句不管是否發生異常都將執行最後的代碼。spa
try: <語句> finally: <語句> #退出try時總會執行 raise
下面案例從代碼上保證了程序的健壯性:操作系統
try: fh = open("testfile", "w") try: fh.write("這是一個測試文件,用於測試異常!!") finally: print "關閉文件" fh.close() except IOError: print "Error: 沒有找到文件或讀取文件失敗"
下面的表列舉了部分標準的python異常
異常名稱 | 描述 |
AssertionError | 斷言語句(assert)失敗 |
AttributeError | 嘗試訪問未知的對象屬性 |
EOFError | 用戶輸入文件末尾標誌EOF(Ctrl+d) |
FloatingPointError | 浮點計算錯誤 |
GeneratorExit | generator.close()方法被調用的時候 |
ImportError | 導入模塊失敗的時候 |
IndexError | 索引超出序列的範圍 |
KeyError | 字典中查找一個不存在的關鍵字 |
KeyboardInterrupt | 用戶輸入中斷鍵(Ctrl+c) |
MemoryError | 內存溢出(可經過刪除對象釋放內存) |
NameError | 嘗試訪問一個不存在的變量 |
NotImplementedError | 還沒有實現的方法 |
OSError | 操做系統產生的異常(例如打開一個不存在的文件) |
OverflowError | 數值運算超出最大限制 |
ReferenceError | 弱引用(weak reference)試圖訪問一個已經被垃圾回收機制回收了的對象 |
RuntimeError | 通常的運行時錯誤 |
StopIteration | 迭代器沒有更多的值 |
SyntaxError | Python的語法錯誤 |
IndentationError | 縮進錯誤 |
TabError | Tab和空格混合使用 |
SystemError | Python編譯器系統錯誤 |
SystemExit | Python編譯器進程被關閉 |
TypeError | 不一樣類型間的無效操做 |
UnboundLocalError | 訪問一個未初始化的本地變量(NameError的子類) |
UnicodeError | Unicode相關的錯誤(ValueError的子類) |
UnicodeEncodeError | Unicode編碼時的錯誤(UnicodeError的子類) |
UnicodeDecodeError | Unicode解碼時的錯誤(UnicodeError的子類) |
UnicodeTranslateError | Unicode轉換時的錯誤(UnicodeError的子類) |
ValueError | 傳入無效的參數 |
ZeroDivisionError | 除數爲零 |
python異常類的層次結構
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
下面的這張圖片是python中的異常繼承樹
python的異常有個大基類BaseException。而後繼承的是Exception。因此咱們自定義類也必須繼承Exception。
#最簡單的自定義異常 class FError(Exception): pass
拋出異常、用try-except拋出
try: raise FError("自定義異常") except FError as e: print(e)
下面的異常類模板比較常見
class CustomError(Exception): def __init__(self,ErrorInfo): super().__init__(self) #初始化父類 self.errorinfo=ErrorInfo def __str__(self): return self.errorinfo if __name__ == '__main__': try: raise CustomError('客戶異常') except CustomError as e: print(e)
當程序出現錯誤,python會自動引起異常,也能夠經過raise顯示地引起異常。一旦執行了raise語句,raise後面的語句將不能執行。
咱們能夠使用raise語句本身觸發異常
raise語法格式以下:
raise [Exception [, args [, traceback]]]
語句中 Exception 是異常的類型(例如,NameError)參數標準異常中任一種,args 是自已提供的異常參數。
最後一個參數是可選的(在實踐中不多使用),若是存在,是跟蹤異常對象。
實例
一個異常能夠是一個字符串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。
定義一個異常很是簡單,以下所示:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 觸發異常後,後面的代碼就不會再執行
注意:爲了可以捕獲異常,"except"語句必須有用相同的異常來拋出類對象或者字符串。
例如咱們捕獲以上異常,"except"語句以下所示:
try: 正常邏輯 except Exception,err: 觸發自定義異常 else: 其他代碼
實例:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定義函數 def mye( level ): if level < 1: raise Exception,"Invalid level!" # 觸發異常後,後面的代碼就不會再執行 try: mye(0) # 觸發異常 except Exception,err: print 1,err else: print 2
執行以上代碼,輸出結果爲:
$ python test.py
1 Invalid level!
python3.6之後 改成
def mye( level ): if level < 1: raise Exception("Invalid level!") # 觸發異常後,後面的代碼就不會再執行 try: mye(0) # 觸發異常 except Exception as err: print(1,err) else: print(2)
python支持assert語句,assert的用法以下:
assert condition
若是condition爲false,那麼raise一個AssertionError出來。邏輯上等同於:
if not condition: raise AssertionError()
也能夠爲assert添加異常參數
assert expression [, arguments] assert 表達式 [, 參數]
案例:
import sys assert ('linux' in sys.platform), "This code runs on Linux only."
參考文章:
https://www.runoob.com/python/python-exceptions.html
https://blog.csdn.net/qq_39247153/article/details/81082313
https://www.geeksforgeeks.org/python-set-5-exception-handling/