異常 異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流以外採取的行為,一般分為如下兩個階段: 1.異常發生:一個錯誤發生後被列印出來,稱為未處理異常,而預設的處理則是自動輸出一些調試信息並終止程式運行。 2.異常處理:通過代碼明確地處理異常,則程式不會終止運行,並增強程式的... ...
異常
異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流以外採取的行為,一般分為如下兩個階段:
1.異常發生:一個錯誤發生後被列印出來,稱為未處理異常,而預設的處理則是自動輸出一些調試信息並終止程式運行。
2.異常處理:通過代碼明確地處理異常,則程式不會終止運行,並增強程式的容錯性。
說白了,異常處理的目的就是為了是程式的可執行性更高,能順利的運行下去;同時不讓用戶看到難堪的錯誤信息,通俗來說就是不讓用戶看見大黃頁。
可以通過python3中的異常類型(Exception)查看異常。
常見的異常:
AttributeError #試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x IOError #輸入/輸出異常;基本上是無法打開文件 ImportError #無法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError #語法錯誤(的子類) ;代碼沒有正確對齊 IndexError #下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] KeyError #試圖訪問字典里不存在的鍵 KeyboardInterrupt #Ctrl+C被按下 NameError #使用一個還未被賦予對象的變數 SyntaxError #Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) TypeError #傳入對象類型與要求的不符合 UnboundLocalError #試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數,導致你以為正在訪問它 ValueError #傳入一個調用者不期望的值,即使值的類型是正確的
更多的異常:
ArithmeticError AssertionError AttributeError BaseException BufferError BytesWarning DeprecationWarning EnvironmentError EOFError Exception FloatingPointError FutureWarning GeneratorExit ImportError ImportWarning IndentationError IndexError IOError KeyboardInterrupt KeyError LookupError MemoryError NameError NotImplementedError OSError OverflowError PendingDeprecationWarning ReferenceError RuntimeError RuntimeWarning StandardError StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError
異常處理
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.msg try: raise Myerror('錯誤') except Exception as f: print(f)
異常處理中還可以使用with語句來簡化代碼,常用於文件處理之中,具體示例見[python拾遺]文件操作