Python28 異常
- 2020 年 1 月 6 日
- 筆記
參考 http://www.cnblogs.com/wupeiqi/articles/5017742.html
異常
name = ['zhangsan','lisi'] print (name[3]) data = {'name':'Amy'} print (data['name']) 執行結果: Traceback (most recent call last): File "E:/python/程式碼練習/B1.py", line 20, in <module> print (name[3]) IndexError: list index out of range #並不存在name[3]這個元素,所以會報錯;但是因為報錯的原因整個程式就崩潰了,下面的程式碼就不會再去執行。
data = {} try: #嘗試執行下面的程式碼 data['name'] except KeyError as k: #否則如果出現了KeyError這個錯誤,就執行下面的程式碼; #如果出現KeyError錯誤,就捕獲錯誤結果然後賦值給這個k(也可以起其他的名字) print ('沒有這個key',k) 執行結果: 沒有這個key 'name'
name = ['zhangsan','lisi'] data = {} try: name[3] #報錯 data['name'] #這裡沒有執行 except KeyError as k: #這裡沒有執行 print ('沒有這個key',k) except IndexError as k: #因為嘗試name[3],但是報錯後直接程式碼就到了這裡;只要出現一個錯誤,就不會處理其他錯誤。 print ('列表元素不存在',k) 執行結果: 列表元素不存在 list index out of range
name = ['zhangsan','lisi'] data = {} try: name[3] data['name'] except (KeyError,IndexError) as k: #可以通過括弧將多種錯誤寫到一起;這種方式適用當出現錯誤時使用同一種處理辦法的場景 print ('錯誤:',k) 執行結果: 錯誤: list index out of range name = ['zhangsan','lisi'] data = {} try: # name[3] #注釋掉 data['name'] except (KeyError,IndexError) as k: print ('錯誤:',k) 執行結果: 錯誤: 'name' #從上到下的錯誤執行順序
name = ['zhangsan','lisi'] data = {} try: # name[3] # data['name'] open('abc.txt') except KeyError as k: print ('沒有這個key',k) except IndexError as k: print ('列表元素不存在',k) except Exception as k: #使用Exception能抓取大部分錯誤;使用場景是當預判的錯誤沒有觸發,但觸發了自己沒有預判的錯誤時,可以使用Exception print ('未知錯誤',k) 執行結果: 未知錯誤 [Errno 2] No such file or directory: 'abc.txt'
try: a = 123 print (a) except KeyError as k: print ('沒有這個key',k) except IndexError as k: print ('列表元素不存在',k) except Exception as k: print ('未知錯誤',k) else: #當沒有任何錯誤時,執行else下面的程式碼 print ('一切正常') 執行結果: 123 一切正常
try: open('abc.txt') a = 123 print (a) except KeyError as k: print ('沒有這個key',k) except IndexError as k: print ('列表元素不存在',k) except Exception as k: print ('未知錯誤',k) else: print ('一切正常') finally: print ('不管有沒有錯誤,都執行該程式碼') 執行結果: 未知錯誤 [Errno 2] No such file or directory: 'abc.txt' 不管有沒有錯誤,都執行改程式碼
try: a = 123 print (a) except KeyError as k: print ('沒有這個key',k) except IndexError as k: print ('列表元素不存在',k) except Exception as k: print ('未知錯誤',k) else: print ('一切正常') finally: print ('不管有沒有錯誤,都執行該程式碼') 執行結果: 123 一切正常 不管有沒有錯誤,都執行該程式碼
ValueError錯誤: s1 = 'hello' try: int(s1) except ValueError as e: print (e) 執行結果: invalid literal for int() with base 10: 'hello'
常用異常:
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x IOError 輸入/輸出異常;基本上是無法打開文件 ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;程式碼沒有正確對齊 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典里不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變數 SyntaxError Python程式碼非法,程式碼不能編譯(語法錯誤) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數, 導致你以為正在訪問它 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的
更多異常:
ArithmeticError AssertionError AttributeError BaseException BufferError BytesWarning DeprecationWarning EnvironmentError EOFError Exception FloatingPointError FutureWarning GeneratorExit ImportError ImportWarning IndentationError IndexError IOError KeyboardInterrupt KeyError LookupError MemoryError NameError NotImplementedError OSError OverflowError PendingDeprecationWarning ReferenceError RuntimeError RuntimeWarning StandardError StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError
自定義異常
class LiSiException(Exception): #自動以異常的名字為:LiSiException #括弧中的Exception是繼承Exception這個基類 def __init__(self, msg): self.message = msg #觸發異常後的資訊 try: raise LiSiException('自定義異常') #因為不是python自帶的異常,所以需要raise來觸發; #'自定義異常'會被傳給self.message except LiSiException as info: #將觸發後的資訊賦值給info print (info) 執行結果: 自定義異常