[python拾遺]異常處理,python拾遺異常處理
異常
異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流程以外採取的行為,一般分為如下兩個階段:
1.異常發生:一個錯誤發生後被列印出來,稱為未處理異常,而預設的處理則是自動輸出一些調試資訊並終止程式運行。
2.異常處理:通過代碼明確地處理異常,則程式不會終止運行,並增強程式的容錯性。
說白了,異常處理的目的就是為了是程式的可執行性更高,能順利的運行下去;同時不讓使用者看到難堪的錯誤資訊,通俗來說就是不讓使用者看見大黃頁。
可以通過python3中的異常類型(Exception)查看異常。
常見的異常:
AttributeError #試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性xIOError #輸入/輸出異常;基本上是無法開啟檔案ImportError #無法引入模組或包;基本上是路徑問題或名稱錯誤IndentationError #語法錯誤(的子類) ;代碼沒有正確對齊IndexError #下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError #試圖訪問字典裡不存在的鍵KeyboardInterrupt #Ctrl+C被按下NameError #使用一個還未被賦予對象的變數SyntaxError #Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError #傳入物件類型與要求的不符合UnboundLocalError #試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,導致你以為正在訪問它ValueError #傳入一個調用者不期望的值,即使值的類型是正確的
更多的異常:
ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError
異常處理
python3中提供try語句處理異常,格式為:
try: print('#先運行別指定的代碼')except Exception as e: #所有的異常都繼承至Exception類,可以捕獲任意異常 print(e) #可以擷取異常e print('#如果發生了異常,執行異常處理')else: print('#如果主代碼塊沒有異常發生並執行完後,則繼續往下執行')
或者:
try: print('#先運行特定的代碼')except Exception as e: print('#捕獲對應的異常並處理之')finally: print('#不管異常與否,最終都會執行')
當然try語句也可以捕獲特定的異常,而非指定異常則無法處理。具體可以看下面幾個例子:
dic = ["English", 'Chinese']try: dic[10]except IndexError as e: print(e)
s1 = 'hello'try: int(s1)except ValueError as e: print(e)
而當遇到非指定異常,則會報錯:
# 未捕獲到異常,程式直接報錯s1 = 'hello'try: int(s1)except IndexError as e: print(e)
當要處理多個異常時也可以這樣寫:
except ( AttributeError,NameError ) as e: print(e) print('#這是捕獲多個類型異常的文法')
雖然Exception可以捕獲任意異常,但對於特殊處理或提醒的異常需要先定義,最後定義Exception來確保程式正常運行。所以下面這種寫法也很常用:
s1 = 'hello'try: int(s1)except KeyError as e: print('鍵錯誤')except IndexError as e: print('索引錯誤')except Exception as e: print('錯誤')
raise語句主動觸發異常,python3中可以利用raise語句拋出一個通用異常類型(Exception),具體如下:
try: raise Exception('錯誤了...') #這是主動引發一個異常except Exception as e: print(e)
python3中也可以通過建立繼承至通用異常類型(Exception)的類,來自訂異常:
#關於raise語句,還有:class Myerror(Exception): def __init__(self,msg): self.msg = msg def __str__(self): # 以字串格式輸出 return self.msgtry: raise Myerror('錯誤')except Exception as f: print(f)
異常處理中還可以使用with語句來簡化代碼,常用於檔案處理之中,具體樣本見[python拾遺]檔案操作