­

python學習之異常處理

  • 2020 年 1 月 13 日
  • 筆記
一、語法導致的異常,應該在程序運行前處理  例子:  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)