python學習之異常處理
一、語法導致的異常,應該在程序運行前處理 例子: print( 輸出: File "E:/python/oldboyday9/learn1.py", line 4 if ^ SyntaxError: invalid syntax 注:輸出分三個部分,第一部分錯我位置,第二部分SyntaxError錯誤類型,第三部分錯誤值invalid syntax 二、邏輯導致的錯誤 使用try...except捕獲異常並處理異常 例子: try: a = 1/0 except Exception as e: print('error: ',e) 三、異常種類 AttributeError 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有屬性x IOError 輸入/輸出異常;基本上是無法打開文件 ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典里不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量, 導致你以為正在訪問它 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的 四、異常處理 python解釋器捕獲異常觸發異常處理,自己也可以觸發異常,編寫異常處理 try: 代碼塊 #有異常觸發,執行except塊 except: 執行處理異常 例子: 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: #捕獲stopiteration異常,執行關閉文件 f.close() 異常類只能捕獲指定的異常,如果不是指定的異常,則報錯 例子: s1 = 'hello'4 try: int(s1) except IndexError as e: print(e) int(s1)不是指定的異常IndexError,所以報錯 多分支異常 例子: s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except StopIteration as e: print(e) 萬能異常Exception 例子: s1 = 'hello' try: int(s1) except Exception as e: print(e) else子塊,沒有異常觸發else 例子: s1 = 'hello' try: int(s1) except Exception as e: print(e) else: print('沒有異常') finally子塊,有沒有異常都觸發finally 例子: s1 = 'hello' try: int(s1) except Exception as e: print(e) finally: print('都會觸發finally') raise關鍵字主動觸發異常 例子: try: raise TypeError('類型異常') except Exception as e: print(e) 自定義錯誤類型 例子 class MyError(BaseException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg try: raise MyError('自定義錯誤類型') except MyError as e: print(e)