目錄python
異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止)。git
語法錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正。安全
# 語法錯誤示範一 if # 語法錯誤示範二 def test: pass # 語法錯誤示範三 class Foo pass # 語法錯誤示範四 print(haha
# TypeError:int類型不可迭代 for i in 3: pass # ValueError num=input(">>: ") #輸入hello int(num) # NameError aaa # IndexError l=['egon','aa'] l[3] # KeyError dic={'name':'egon'} dic['age'] # AttributeError class Foo:pass Foo.x # ZeroDivisionError:沒法完成計算 res1=1/0 res2=1+'str'
在python中不一樣的異常能夠用不一樣的類型(python中統一了類與類型,類型即類)去標識,==一個異常標識一種錯誤==。框架
爲了保證程序的健壯性與容錯性,即在遇到錯誤時程序不會崩潰,咱們須要對異常進行處理,目的就是爲了程序可以正常運行。調試
Age = 10 while True: age = input('>>:').strip() if age.isdigit(): age = int(age) if age == Age: print('you got it') break #輸出: >>:chen >>:2 >>:10 you got it
若是錯誤發生的條件是不可預知的,則須要用到try...except:在錯誤發生以後進行處理code
#基本語法 try: 被檢測的代碼 except 異常類型: try中一旦檢測的異常,就會執行這個位置的邏輯
舉例對象
try: f = [ 'a', 'a', 'a', 'a', 'a', ] 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() #輸出: a a a a a
異常類只能用來處理指定的異常狀況,若是非指定異常則沒法處理blog
s1 = 'hello' try: int(s1) except IndexError as e: # 未捕獲到異常,程序直接報錯,異常不一樣 print(e)
多分支索引
s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) #輸出: invalid literal for int() with base 10: 'hello'
萬能異常Exceptionip
s1 = 'hello' try: int(s1) except Exception as e: print(e) #輸出: invalid literal for int() with base 10: 'hello'
多分支異常和萬能異常
萬能異常:不管出現什麼異常,咱們統一丟棄,或者說使用同一段代碼邏輯去處理他們。
多分支異常:對於不一樣的異常咱們須要定製不一樣的處理邏輯,那就須要用到多分支了。
在多分支後來一個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) #輸出: invalid literal for int() with base 10: 'hello' ## 多分支異常處理檢測出異常後,萬能異常就不會起做用了
異常的最終執行
最終的意思,不管報不報錯都會打印
s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) else: print('try內代碼塊沒有異常則執行我') finally: print('不管異常與否,都會執行該模塊,一般是進行清理工做') #輸出: invalid literal for int() with base 10: 'hello' 不管異常與否,都會執行該模塊,一般是進行清理工做
try: raise TypeError('拋出異常,類型錯誤') except Exception as e: print(e) #輸出: 拋出異常,類型錯誤
raise 主動拋錯,沒有用.
做用: 建立框架/建立語言 C/C++ 有用
class EgonException(BaseException): def __init__(self,msg): self.msg = msg def _str_(self): return self.msg try: raise EgonException("拋出異常,類型錯誤") except EgonException as e: print(e) #輸出: 拋出異常,類型錯誤
斷言,最先的時候沒有pycharm,用這個作調試。
assert 1==1
條件成立會跳過,條件錯誤會報AssertionError錯誤
try: assert 1 == 2 except Exception as e: print(e)