更新ing
常見的報錯類型和簡析、異常處理、其他類型的報錯(異常)類型簡介、自定義異常
常見的報錯類型和簡析:
報錯類型 | 報錯內容 | 錯誤類型判斷 | 錯誤解決方式 |
AttributeError | 屬性錯誤:常見於試圖訪問一個對象沒有 |
程序嘗試訪問的對象沒有對應的屬性,查看屬性是否存在 | |
AttributeError | AttributeError: module '×××' has no attribute '×××' | 屬性錯誤:調用的模塊沒有指定的屬性 | 如果是調用的標准模塊或者第三方模塊,確認是否出現自定義文件或目錄與其重名 |
AssertionError | 斷言錯誤 | assert 斷言語句不符合條件下時會拋出此異常 | |
ArgumentError | sqlalchemy.exc.ArgumentError: Mapper mapped class ***->*** could not assemble any primary key columns for mapped table '***' | 爭議異常:sqlalchemy在尋址數據表時,沒找到匹配的主鍵 | 檢查主鍵指定是否有誤,或者格式是否正確 |
BrokenPipeError | BrokenPipeError: [Errno 32] Broken pipe | 鏈接斷開 | 核實建立的鏈接狀態,可能服務端在發送時,使用的發送對象是鏈接對象(socket)而不是交互對象(conn或request等) |
ConnectionError | redis.exceptions.ConnectionError: Error 10061 connecting to localhost:6379. 由於目標計算機積極拒絕,無法連接 | 鏈接異常:redis服務器斷開。 | 檢查redis服務端是否關閉,重啟 |
ConnectionResetError | ConnectionResetError: [Errno 104] Connection reset by peer | 鏈接異常:客戶端請求過於頻繁 | |
ConnectionResetError | ConnectionResetError: [WinError 10054] 遠程主機強迫關閉了一個現有的連接。 | 鏈接異常:客戶端強制關閉。python3.x中,當客戶端強制關閉時,widows系統的服務端不再收取空數據,而是直接報錯。linux系統會陷入接收空數據的死循環 | 可用try……進行異常捕捉和處理 |
ConnectionRefusedError | ConnectionRefusedError: [Errno 111] Connection refused | 鏈接異常,鏈接無法建立 | 檢查服務端是否運行並提供服務 |
ConnectionRefusedError | ConnectionRefusedError: [WinError 10061] 由於目標計算機積極拒絕,無法連接。 | 鏈接異常:服務器積極拒絕請求 | 服務器端接入數量達到上限 |
|
|
||
IndentationError | IndentationError:unexpected indent | 縮進格式錯誤:意外縮進 | 檢查縮進、空格 |
IndentationError | IndentationError:unindent does not match any outer indentation level | 格式錯誤:縮進方式不一致,有的用空格(數量是否一致),有的用Tab | 調整對應內容的縮進,一致(4空格) |
IndentationError | IndentationError:expected an indented block | 格式錯誤:出現了不應該有的額空格 | |
IndexError | IndexError:list index out of range | 索引錯誤:索引超出范圍 | 嘗試訪問序列時,索引超出定義的范圍 |
IoError | 輸入/輸出異常:常見於是無法打開文件 |
核實訪問對象的路徑和名稱 | |
KeyError | 鍵值錯誤:試圖訪問字典里不存在的鍵 |
||
KeyboardInterrupt | 鍵盤輸入異常 | ||
NameError | 名字錯誤:常見於使用一個還未被賦予對象的變量 |
||
NameError | NameError: free variable **** referenced before assignment in enclosing scope | 名字錯誤:自由變量在封閉代碼塊中,調用前未進行初始化或完成指定 | |
NameError | NameError: name *** is not defined | 名字錯誤:使用前未定義 | 檢查變量是否已經定義,命名格式是否正確 |
RecursionError | RecursionError: maximum recursion depth exceeded in comparison | 遞歸超過了最大的深度。 | 1000 |
RecursionError | RecursionError: maximum recursion depth exceeded | 遞歸超過了最大深度 | |
RuntimeError | RuntimeError: dictionary changed size during iteration | 運行期間異常:字典在遍歷過程中發生了變動 | 原則上,對於可變數據類型,在遍歷過程中,不能直接對元素進行操作,否則會導致遍歷退出病報錯。 可以轉為對字典key值遍歷,而不是對其對象直接遍歷,for i in dict1.keys() |
SyntaxError | SyntaxError:invalid syntax | 語法錯誤:無效語法 | |
SyntaxError | SyntaxError: non-default argument follows default argument | 語法錯誤:非默認參數跟隨默認參數,此類錯誤出現在默認參數后面跟着其他關鍵參數 | 調整關鍵參數的位置,至默認參數前 |
SyntaxError | SyntaxError: positional argument follows keyword argument | 語法錯誤:關鍵參數后面跟着位置參數,即在鍵值對參數后面出現了基本數據類型參數 | 調整形參,或者調整傳遞實參的順序 |
SyntaxError | SyntaxError: no binding for nonlocal '****' found | 語法錯誤:在上一層函數中未找到指定的變量 | |
SyntaxError | SyntaxError: unexpected EOF while parsing | 語法錯誤:語法分析過程遇到意外eof | 如果程序中有eval(),看是否對空值進行了處理 |
TypeError | TypeError: ***** missing 1 required positional argument: “@@” | 類型錯誤:****需要1個位置參數,但沒給 | 傳入的數據類型與要求的不符 |
TypeError | TypeError: not all arguments converted during string formatting | 類型錯誤:在格式化輸出過程中前后% 參數不對應 | 查看參數數量、類型等是否對應 |
TypeError | TypeError: __init__() missing 1 required positional argument: 'on_delete' | 類型錯誤: 在django2.0后,定義外鍵和一對一關系的時候需要加on_delete選項,此參數為了避免兩個表里的數據不一致問題,不然會報錯 | on_delete常用值有 models.CASCADE:此值設置,是級聯刪除。 models.PROTECT:此值設置,是會報完整性錯誤。 models.SET_NULL:此值設置,會把外鍵設置為null,前提是允許為null。 models.SET_DEFAULT:此值設置,會把設置為外鍵的默認值。 models.SET():此值設置,會調用外面的值,可以是一個函數。 一般情況下使用models.CASCADE。 |
TypeError | TypeError: 'type' object is not subscriptable | 類型錯誤:操作對象不支持下標訪問 | 檢查對象是否引用正確,對象名字拼寫是否正確 |
TypeError | TypeError: 'NoneType' object is not callable | 類型錯誤:“nonetype”對象不可調用 | |
|
常見於:試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量, |
||
UnboundLocalError | UnboundLocalError: local variable '****' referenced before assignment | 未指定造成的局部錯誤:局部變量在被使用前未初始化或未給予相應指定。
|
|
ValueError | 常見於:傳入一個調用者不期望的值,即使值的類型是正確的 |
||
ValueError | ValueError: invalid literal for int() with base 10 | ||
ValueError | ValueError: Sample larger than population or is negative | sample所隨機選取的內容數量,大於選擇的范圍 | 核實帶選擇的范圍是否能完全包住要選擇的數量 |
OSError | OSError: [WinError 10057] 由於套接字沒有連接並且(當使用一個 sendto 調用發送數據報套接字時)沒有提供地址,發送或接收數據的請求沒有被接受。 | 沒有建立正確的鏈接,套接字引用出錯 | |
OSError | OSError: [Error 48] Address in use | 鏈接地址異常:端口正在被使用 | |
程序中的錯誤可以大致分為語法錯誤和邏輯錯誤兩大類。語法錯誤是指,編寫的程序違反了python的基本語法規則,這樣的錯誤會在解析過程中,直接報錯。邏輯錯誤,則是整個程序的設計錯誤。
異常處理:
如果錯誤發生的條件是可以預知的,最好是用if 條件進行處理,盡量不用異常處理。這主要是因為異常處理會嚴重影響程序整體的可讀性。
當程序發成的錯誤條件是不可知的,則可以通過添加異常處理機制。
執行異常處理的目的:捕捉程序整體的運行錯誤信息,按指定的方式進行處理,可以避免捕捉到的異常影響程序的整體運行。
程序運行報錯的信息,可以分為異常尋址信息,異常類型和具體的異常信息,三部分內容。
基本格式:
- (在python2.x中,except語句格式,“except “錯誤類型” ,e:”;在python3.x中,except語句格式,“except “錯誤類型” as e:”)
- 可以用 raise 異常類型('異常具體信息') 進行主動異常出發,阻斷程序的進一步執行。
常見用法:
- 多分支處理。利用except 列出每一種可以預知的異常類型,並給出相應的處理。
- 利用 except Exception 可以捕捉到所有類型的異常,顆粒度較大。
- else 之后跟的語句,是沒有發生異常的情況下執行的語句
- filnally 之后的語句,是無論被檢測的代碼塊是否出現異常,都會執行的語句。通常可用於資源回收

1 # 異常處理的基本語法格式 2 try: 3 """ 4 執行代碼塊 5 """ 6 7 except “錯誤類型”as e: # 錯誤類型可以是單一的,可以是多個,當參數是exception時,抓住所有的錯誤類型,統一處理一般放在最后抓剩余的未知錯誤類型 8 9 """ 10 處理對應異常的代碼塊,e是具體的錯誤信息 11 """ 12 else: 13 """ 14 當一切正常執行,無錯誤時,執行的代碼塊 15 """ 16 finally: 17 """ 18 不管整體是否出錯,都會執行此代碼塊 19 """
斷言assert簡單介紹:
- 執行目的:斷定語法應該是……類型
- 基本語法 assert 判斷條件
- 返回的是布爾值,可以和if 判斷結合使用。
其他類型的報錯(異常)類型簡介:
自定義異常:
在系統異常之外,自定義的異常可以協助我們鋪捉到代碼邏輯異常之外的業務邏輯異常。自定義異常繼承自系統異常,一般情況下,自定義異常雖然能對系統異常進行重寫,但一般情況下不建議,所以,一般情況下自定義異常命名不能用系統異常的名字。

1 # -------------自定義異常--------------- 2 class MyException(BaseException): # 繼承異常的基類 BaseException 3 def __init__(self,msg): 4 super(MyException,self).__init__() # 繼承父類的初始化信息 5 self.msg = msg # 重寫自定義的信息 6 def __str__(self): # 定義異常的打印格式 7 re_msg = '< %s >' % self.msg 8 return re_msg 9 10 raise MyException # 主動觸發異常,本質上完成兩個動作,一、阻斷程序運行並捕捉異常信息;二、打印異常信息