標籤:訪問 strip() 異常類 命名 物件類型 pytho pychar 簡單 func
一.異常處理的定義
python解譯器檢測到錯誤,觸發異常(也允許程式員自己觸發異常)
程式員編寫特定的代碼,專門用來捕捉這個異常(這段代碼與程式邏輯無關,與異常處理有關)
如果捕捉成功則進入另外一個處理分支,執行你為其定製的邏輯,使程式不會崩潰,這就是異常處理
二.異常處理的用法
為了保證程式的健壯性與容錯性,即在遇到錯誤時候程式不會崩潰,我們需要對異常進行處理,
1,如果錯誤發生的條件是可預知的,我們需要用if進行處理,在錯誤發生之前進行預防
age1 = 10while True: age=input(‘輸入: ‘) if age.isdigit(): #只有在age為字串形式的整數時,下列代碼才不會出錯,該條件是可預知的 age=int(age) if age == age1: print(‘you got it‘) break
2,如果錯誤發生的條件是不可預知的,則需要用到try..except:在錯誤發生之後進行處理
三.基本文法為
try: 被檢測的代碼塊except 異常類型: try中一旦檢測到異常,就執行這個位置的邏輯
舉例
try: f=open(‘a.txt‘) g=(line.strip() for line in f) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))except StopIteration: f.close()
四.try...except...的詳細用法
我們把可能發生錯誤的語句放在try模組裡,用except來處理異常。except可以處理一個專門的異常,也可以處理一組圓括弧中的異常,如果except後沒有指定異常,則預設處理所有的異常。每一個try,都必須至少有一個except
1.異常類只能來處理指定的異常情況,如果非指定異常則無法處理
s1 = ‘hello‘try: int(s1)except IndexError as e: # 捕獲到異常,程式直接報錯 print(e)
2.多分支
s1 = ‘hello‘try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)
3.萬能異常Exception
s1 = ‘hello‘try: int(s1)except Exception as e: print(e)
4.多分支+Exception
s1 = ‘hello‘try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)except Exception as e: print(e)
5.異常的其他機構(try...finally文法)
try...finally語句無論是否發生異常都將會執行最後的代碼。文法如下:
try:<語句>finally:<語句> #退出try時總會執行raise
樣本:
s1 = ‘hello‘try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)except Exception as e: print(e)else: print(‘try內代碼塊沒有異常則執行我‘)finally: print(‘無論異常與否,都會執行該模組,通常是進行清理工作‘)
6.主動觸發異常(raise語句)
我們可以使用raise語句自己觸發異常,raise文法格式如下:
raise [Exception [, args [, traceback]]]
語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是"None"。
最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
樣本:
一個異常可以是一個字串,類或對象。 Python的核心提供的異常,大多數都是執行個體化的類,這是一個類的執行個體的參數。
定義一個異常非常簡單,如下所示:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 觸發異常後,後面的代碼就不會再執行try: raise TypeError(‘類型錯誤‘)except Exception as e: print(e)
7.自訂異常
通過建立一個新的異常類,程式可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。
以下為與BaseException相關的執行個體,執行個體中建立了一個類,基類為BaseException,用於在異常觸發時輸出更多的資訊。
在try語句塊中,使用者自訂的異常後執行except塊語句,變數 e 是用於建立Networkerror類的執行個體。
class Networkerror(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: raise Networkerror(‘類型錯誤‘)except Networkerror as e: print(e)
8.斷言:assert條件
assert 1 == 1 #不會報錯assert 1 == 2 #會報錯assert 1 != 1 #會報錯
栗子:
def is_huiwen_num(num): snum = str(num) return snum == snum[::-1]# 如果希望程式中的所有assert語句不執行, 那麼給python -O 指令碼名if __name__ == "__main__": assert is_huiwen_num(100) == True #會在這裡直接拋出異常,中斷執行過程 assert is_huiwen_num(101) == True print("assert")運行結果:Traceback (most recent call last): File "/home/kiosk/PycharmProjects/python_projects/ttttt.py", line 7, in <module> assert is_huiwen_num(100) == TrueAssertionError
五.常見異常種類
在python中不同的異常可以用不同的類型(python中統一了類與類別,類型即類)取標識,一個異常標識一種錯誤。
常見語法錯誤
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性xIOError 輸入/輸出異常;基本上是無法開啟檔案ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]KeyError 試圖訪問字典裡不存在的鍵KeyboardInterrupt Ctrl+C被按下NameError 使用一個還未被賦予對象的變數SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)TypeError 傳入物件類型與要求的不符合UnboundLocalError 試圖訪問一個還未被設定的局部變數,基本上是由於另有一個同名的全域變數,導致你以為正在訪問它ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
Python學習—異常