錯誤和異常處理
在python中一共有2種錯誤:一種是語法錯誤,另外一種是異常。
語法錯誤
語法錯誤也叫做解析錯誤,是指python無法正確的識別代碼的造成的。根本原因在于人的行為:手殘,腦殘和眼殘的行為。
解決方法:按照正確的語法進行書寫就沒這個錯誤了!
異常
異常是指在語法正確的前提下,程序的報錯就是異常。
它是在程序異常時單獨存在的一個對象,可以對其進行獲取或其他操作
異常的分類
AssertError 斷言語句(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 除數為零
常見的錯誤操作:
IndexError 索引錯誤
lists = [1,3,6]
print(lists[3])
KeyError 鍵不存在
dicts = {'gp':'高坡','cr':'曹睿','tw':'唐偉'}
print(dicts['zj'])
nameError 變量不存在
print(ch)
AssertError 斷言錯誤
assert 1>0
assert 3>5
IndentationError縮進錯誤
def myfunc():print('眼殘')print('眼殘')
錯誤異常處理
try:#嘗試實現某個操作,#如果沒出現異常,任務就可以完成#如果出現異常,將異常從當前代碼塊扔出去嘗試解決異常
except 異常類型1:
#解決方案1:用于嘗試在此處處理異常解決問題
except 異常類型2:
#解決方案2:用于嘗試在此處處理異常解決問題
except (異常類型1,異常類型2.…)
#解決方案:針對多個異常使用相同的處理方式
excpet:
#解決方案:所有異常的解決方案
else:
#如果沒有出現任何異常,將會執行此處代碼
finally:
#管你有沒有異常都要執行的代碼
處理過程:
try:#嘗試執行代碼區域。#如果沒有錯誤,那就沒啥事了,則執行else區域#如果出現錯誤,拋出錯誤異常對象,由下面的其他塊嘗試接受錯誤
except 異常類型1:
#如果try塊扔出的異常類型和當前指定類型一直,那么則當前塊接收錯誤,并且在當前區域給出錯誤的解決方案。(非必須)
#如果try塊扔出的異常類型和當前指定類型不一直,則將異常扔到下一個代碼塊檢測
except 異常類型2:
#如果try塊扔出的異常類型和當前指定類型一直,那么則當前塊接收錯誤,并且在當前區域給出錯誤的解決方案。(非必須)
#如果try塊扔出的異常類型和當前指定類型不一直,則將異常扔到下一個代碼塊檢測
except 異常類型3:
#如果try塊扔出的異常類型和當前指定類型一直,那么則當前塊接收錯誤,并且在當前區域給出錯誤的解決方案。(非必須)
#如果try塊扔出的異常類型和當前指定類型不一直,則將異常扔到下一個代碼塊檢測
except (異常類型4,異常類型5,…)
#如果try塊扔出的異常類型和當前指任意定類型一直,那么則當前塊接收錯誤,并且在當前區域給出錯誤的解決方案。(非必須)
#如果try塊扔出的異常類型和當前指定類型不一直,則將異常扔到下一個代碼塊檢測
except: #所有異常
#如果其他except塊均不能接受異常對象,那么則當前塊接受異常,并且進行處理即可(非必須)
else:
#try區域代碼沒有任何異常,則else區域執行(非必須)
finally:
#無論出現或者不出現異常,當前塊都會執行
用戶自定義錯誤和自定義拋出錯誤
用戶自定義異常拋出操作
raise 異常對象
用戶自定義異常類
class 異常類名(RuntimeError):
#定義用戶拋出自定義異常對象時可以向對象中傳入的內容信息(由用戶自己決定)
def __init__(self,errormsg...):#接收用戶創建對象時傳入的錯誤信息,并且存入對象,方便后期使用self.errormsg = errormsg#...
pass
在try..except中接收異常對象
try:#嘗試代碼執行區域
except 異常類型 as 異常對象變量:#解決方案
except 異常類型 as 異常對象變量:#解決方案
#....
with語法
在文件操作中用于監控文件的使用狀態,在文件不使用時自動關閉文件操作。
文件操作
try:#程序監控打開的1.txt文件with open('1.txt','r') as fp:#讀取文件text = fp.read()print(text)
except:print('文件操作出錯!')