AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x IOError 輸入/輸出異常;基本上是沒法打開文件 ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典裏不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量, 致使你覺得正在訪問它 ValueError 傳入一個調用者不指望的值,即便值的類型是正確的
基本寫法:安全
try: .......要執行的代碼 except '寫入異常的類型': ..........跳過異常
異常類只能用在指定的異常狀況,若是不能肯定異常的類型是不能使用的。服務器
萬能捕獲異常:spa
Exception 這個異常確實能捕捉全部的異常,可是出現的全部異常都只能執行Exception下的代碼。若是需求是出現什麼異常就走該異常下的代碼,就要換多分支的異常捕捉。 code
try: print('-------') print('-------') print('-------') print(y) print('======') except NameError: print('11111') except Exception as n: #Exception萬能捕捉異常 print(n)
多分支:對象
try: print('-------') print('-------') print('-------') print(x) print('======') except KeyError: pass except NameError as n: #類型:值,能夠理解成k:v print(n) else:#當try的代碼執行沒有報錯,就會執行這個代碼 print('沒有異常的時候就執行這個代碼......') finally: #不能tey except 的執行結果,最後都會執行這個代碼 print('最後執行的代碼,作清理的代碼...')
爲異常類附變量blog
try: print(yy) eccept NameError as n: #NameError as n pass
也能夠在多分支後面來一個Exception 索引
try: print('-------') print('-------') print('-------') print(y) print('======') except NameError: pass except KeyError: pass except ValueError: pass except Exception: #Exception萬能捕捉異常 print() ''' Python就是逐行讀取 '''
異常的其餘語句寫法:開發
try: .....except:.....else:....finally:.....it
try: print('-------') print('-------') print('-------') print(x) print('======') except KeyError: pass except NameError as n: #類型:值,能夠理解成k:v print(n) else:#當try的代碼執行沒有報錯,就會執行這個代碼 print('沒有異常的時候就執行這個代碼......') finally: #不能tey except 的執行結果,最後都會執行這個代碼 print('最後執行的代碼,作清理的代碼...')
finally:清理,好比:用戶登錄在輸入帳戶或密碼錯誤的時候,就應該要將該頁面從服務器端清理掉,否則當用戶反覆的去調取,就會使服務端死機。io
主動拋出異常:
try: raise TypeError('沒有這個key值') except KeyError: pass ''' Traceback (most recent call last): raise TypeError('沒有這個key值') TypeError: 沒有這個key值 '''
自定義異常報錯:
class ad(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise ad('類型錯誤') except ad as e: print(e)
斷言:
在開發一個程序時候,與其讓它運行時崩潰,不如在它出現錯誤條件時就崩潰(返回錯誤)。這時候斷言assert
就顯得很是有用。
x = 1 y = 1 assert x == 4 #當不知足的時候,就不會往下執行代碼, print(11111)
使用try..except的方式
1:把錯誤處理和真正的工做分開來
2:代碼更易組織,更清晰,複雜的工做任務更容易實現;
3:毫無疑問,更安全了,不至於因爲一些小的疏忽而使程序意外崩潰了;
儘可能少使用try....except,由於他的可讀性差。