標籤:實現 報錯 斷言 處理機 針對 color opened idt splay
一、異常處理
錯誤和異常:
1、錯誤的種類:
1)語法錯誤:這種錯誤,根本過不了python解譯器的文法檢測,必須在程式執行前就改正
2)邏輯錯誤:
例如: res1=1/0 、es2=1+‘str‘
2、異常:異常就是程式運行時發生錯誤的訊號,在python中,錯誤觸發的異常如下:
Traceback:y追蹤異常的來源
NameError:異常的類型
name ‘aa‘ is not defined: 異常值
3、異常的種類
在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,不同的類對象標識不同的異常,一個異常標識一種錯誤
常見異常
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性xIOError 輸入/輸出異常;基本上是無法開啟檔案ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError 試圖訪問字典裡不存在的鍵KeyboardInterrupt Ctrl+C被按下NameError 使用一個還未被賦予對象的變數SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError 傳入物件類型與要求的不符合UnboundLocalError 試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,導致你以為正在訪問它ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
其它異常:
ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError
更多異常
異常處理
1、異常處理概念:
python解譯器檢測到錯誤,觸發異常(也允許程式員自己觸發異常)
程式員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程式邏輯無關,與異常處理有關)
如果捕捉成功則進入另外一個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理
2、為何要進行異常處理:
python解析器去執行程式,檢測到了一個錯誤時,觸發異常,異常觸發後且沒被處理的情況下,程式就在當前異常處終止,後面的代碼不會運行,誰會去用一個運行著突然就崩潰的軟體。所以你必須提供一種異常處理機制來增強你程式的健壯性與容錯性
3、如何進行異常處理:
異常是由程式的錯誤引起的,文法上的錯誤跟異常處理無關,必須在程式運行前就修正
1、使用 if 判斷式
age=input(‘>>: ‘).strip()if age.isdigit(): int(age)
總結:
1.if判斷式的異常處理只能針對某一段代碼,對於不同的程式碼片段的相同類型的錯誤你需要寫重複的if來進行處理。
2.在你的程式中頻繁的寫與程式本身無關,與異常處理有關的if,就像是在你的代碼中到處打補丁。可讀性極其的差
3.這是可以解決異常的,只是存在1,2的問題,所以,千萬不要妄下定論if不能用來異常處理。如果你不服,那你想想在沒有學習try...except之前,你的程式難道就沒有異常處理,而任由其崩潰麼
1 def test(): 2 print(‘test running‘) 3 choice_dic={ 4 ‘1‘:test 5 } 6 while True: 7 choice=input(‘>>: ‘).strip() 8 if not choice or choice not in choice_dic:continue #這便是一種異常處理機制啊 9 choice_dic[choice]()10 11 打到你服為止異常處理舉例
2、python特定文法結構處理
python為每一種異常定製了一個類型,然後提供了一種特定的文法結構用來進行異常處理
1)基本文法
try: 被檢測的代碼塊except 異常類型: try中一旦檢測到異常,就執行這個位置的邏輯
2)異常類只能用來處理指定的異常情況,如果非指定異常則無法處理
# 未捕獲到異常,程式直接報錯s1 = ‘hello‘try: int(s1)except IndexError as e: print e>>ValueError: invalid literal for int() with base 10: ‘hello‘
3)異常類可以多分支
try: print(‘===>run‘) num=input(‘>>: ‘) int(num) d={‘a‘:1} print(‘==dic["b"]=>‘,d[‘b‘]) 1/0 l=[] l[10000] 1+‘2‘ class Foo: pass Foo.xexcept ValueError as e1: print(‘valueerror:‘,e1)except KeyError as e2: print(‘keyerror:‘,e2)except ZeroDivisionError as e3: print(‘zero:‘,e3)except IndexError as e4: print(‘index:‘,e4)except TypeError as e5: print(‘type:‘,e5)except AttributeError as e6: print(‘attr: ‘,e6)
4)萬能異常 在python的異常中,有一個萬能異常:Exception,他可以捕獲任意異常,即:
try: print(‘===>run‘) num=input(‘>>: ‘) int(num) d={‘a‘:1} print(‘==dic["b"]=>‘,d[‘b‘]) 1/0 l=[] l[10000] 1+‘2‘ class Foo: pass Foo.xelse: #沒有異常時才會執行 print(‘try內代碼塊沒有異常則執行我‘)
finally: #有沒有異常都會執行 print(‘finally‘)
5)raise 主動觸發異常
try: raise TypeError(‘類型錯誤‘)except Exception as e: print(e)
6)自訂異常
class EgonException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: raise EgonException(‘類型錯誤‘)except EgonException as e: print(e)
7)斷言
students=[]students.append(‘s1‘)students.append(‘s2‘)assert len(students) > 10 #斷言條件成立才執行下面代碼 print(‘hhhhh‘)
try..except的方式比較if的方式的好處
try..except這種異常處理機制就是取代if那種方式,讓你的程式在不犧牲可讀性的前提下增強健壯性和容錯性
異常處理中為每一個異常定製了異常類型(python中統一了類與類型,類型即類),對於同一種異常,一個except就可以捕捉到,可以同時處理多段代碼的異常(無需‘寫多個if判斷式’)減少了代碼,增強了可讀性
使用try..except的方式
1:把錯誤處理和真正的工作分開來
2:代碼更易組織,更清晰,複雜的工作任務更容易實現;
3:毫無疑問,更安全了,不至於由於一些小的疏忽而使程式意外崩潰了
什麼時候用異常處理:
try...except應該盡量少用,因為它本身就是你附加給你的程式的一種異常處理的邏輯,與你的主要的工作是沒有關係的
這種東西加的多了,會導致你的代碼可讀性變差而且異常處理本就不是你2b邏輯的擦屁股紙,只有在有些異常無法預知的情況下,才應該加上try...except,其他的邏輯錯誤應該盡量修正
Python基礎(19)_異常處理