異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止),在python中,錯誤觸發的異常以下html
錯誤分爲:python
語法錯誤(程序運行前須要改正該錯誤)spa
邏輯錯誤code
# print(sdfsf #SyntaxError # print(a) # NameError # print(int([1,2,3])) #TypeError # print(3/0) #ZeroDivisionError
一個異常標識一種錯誤htm
常見異常:對象
AttributeError 試圖訪問一個對象沒有的屬性
IOError 輸入/輸出異常;基本上是沒法打開文件
ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,致使你覺得正在訪問它
ValueError 傳入一個調用者不指望的值,即便值的類型是正確的blog
程序發生錯誤時會產生異常,該異常由解釋器拋出,同時會終止程序的運行。爲了保證程序的健壯性與容錯性,即在遇到錯誤時程序不會崩潰,咱們須要對異常進行處理。索引
若是錯誤發生的條件是可預知的,咱們須要用if進行處理:在錯誤發生以前進行預防ip
若是錯誤發生的條件是不可預知的,則須要用到try...except:在錯誤發生以後進行處理get
1 #基本語法爲 2 try: 3 被檢測的代碼塊 4 except 異常類型: 5 try中一旦檢測到異常,就執行這個位置的邏輯 6 7 #舉例 8 try: 9 f=open('a.txt') 10 g=(line.strip() for line in f) 11 print(next(g)) 12 print(next(g)) 13 print(next(g)) 14 print(next(g)) 15 print(next(g)) 16 except StopIteration: 17 f.close()
1 #1 異常類只能用來處理指定的異常狀況,若是非指定異常則沒法處理。 2 s1 = 'hello' 3 try: 4 int(s1) 5 except IndexError as e: # 未捕獲到異常,程序直接報錯 6 print e 7 8 #2 多分支 9 s1 = 'hello' 10 try: 11 int(s1) 12 except IndexError as e: 13 print(e) 14 except KeyError as e: 15 print(e) 16 except ValueError as e: 17 print(e) 18 19 #3 萬能異常Exception 20 s1 = 'hello' 21 try: 22 int(s1) 23 except Exception as e: 24 print(e) 25 26 #4 多分支異常與萬能異常 27 #4.1 若是你想要的效果是,不管出現什麼異常,咱們統一丟棄,或者使用同一段代碼邏輯去處理他們,那麼騷年,大膽的去作吧,只有一個Exception就足夠了。 28 #4.2 若是你想要的效果是,對於不一樣的異常咱們須要定製不一樣的處理邏輯,那就須要用到多分支了。 29 30 #5 也能夠在多分支後來一個Exception 31 s1 = 'hello' 32 try: 33 int(s1) 34 except IndexError as e: 35 print(e) 36 except KeyError as e: 37 print(e) 38 except ValueError as e: 39 print(e) 40 except Exception as e: 41 print(e) 42 43 #6 異常的其餘機構 44 s1 = 'hello' 45 try: 46 int(s1) 47 except IndexError as e: 48 print(e) 49 except KeyError as e: 50 print(e) 51 except ValueError as e: 52 print(e) 53 #except Exception as e: 54 # print(e) 55 else: 56 print('try內代碼塊沒有異常則執行我') 57 finally: 58 print('不管異常與否,都會執行該模塊,一般是進行清理工做') 59 60 #7 主動觸發異常 61 try: 62 raise TypeError('類型錯誤') 63 except Exception as e: 64 print(e) 65 66 #8 自定義異常 67 class EgonException(BaseException): 68 def __init__(self,msg): 69 self.msg=msg 70 def __str__(self): 71 return self.msg 72 73 try: 74 raise EgonException('類型錯誤') 75 except EgonException as e: 76 print(e) 77 78 #9 斷言:assert 條件 79 assert 1 == 1 80 assert 1 == 2
if也能夠對異常進行處理,但不夠方便,推薦使用try-expect
try...except是附加給的程序的一種異常處理的邏輯,與主要的工做是沒有關係的,這種東西加的多了,會致使代碼可讀性變差
只有在錯誤發生的條件沒法預知的狀況下,才應該加上try...except