Python學習—異常

  • 2020 年 1 月 14 日
  • 筆記

一.異常處理的定義

  python解釋器檢測到錯誤,觸發異常(也允許程式設計師自己觸發異常)

  程式設計師編寫特定的程式碼,專門用來捕捉這個異常(這段程式碼與程式邏輯無關,與異常處理有關)

  如果捕捉成功則進入另外一個處理分支,執行你為其訂製的邏輯,使程式不會崩潰,這就是異常處理

二.異常處理的用法

  為了保證程式的健壯性與容錯性,即在遇到錯誤時候程式不會崩潰,我們需要對異常進行處理, 1,如果錯誤發生的條件是可預知的,我們需要用if進行處理,在錯誤發生之前進行預防

age1 = 10  while True:      age=input('輸入: ')          if age.isdigit(): #只有在age為字元串形式的整數時,下列程式碼才不會出錯,該條件是可預知的          age=int(age)          if age == age1:              print('you got it')              break

2,如果錯誤發生的條件是不可預知的,則需要用到try..except:在錯誤發生之後進行處理

三.基本語法為

try:      被檢測的程式碼塊  except 異常類型:      try中一旦檢測到異常,就執行這個位置的邏輯

舉例

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:      f.close()

四.try...except...的詳細用法

  我們把可能發生錯誤的語句放在try模組里,用except來處理異常。except可以處理一個專門的異常,也可以處理一組圓括弧中的異常,如果except後沒有指定異常,則默認處理所有的異常。每一個try,都必須至少有一個except 1.異常類只能來處理指定的異常情況,如果非指定異常則無法處理

s1 = 'hello'  try:      int(s1)  except IndexError as e: # 捕獲到異常,程式直接報錯      print(e)

2.多分支

s1 = 'hello'  try:      int(s1)  except IndexError as e:      print(e)  except KeyError as e:      print(e)  except ValueError as e:      print(e)

3.萬能異常Exception

s1 = 'hello'  try:      int(s1)  except Exception as e:      print(e)

4.多分支+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)

5.異常的其他機構(try...finally語法)

  try...finally語句無論是否發生異常都將會執行最後的程式碼。語法如下:

try:  <語句>  finally:  <語句>    #退出try時總會執行  raise

 示例:

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)  else:      print('try內程式碼塊沒有異常則執行我')  finally:      print('無論異常與否,都會執行該模組,通常是進行清理工作')

6.主動觸發異常(raise語句)

  我們可以使用raise語句自己觸發異常,raise語法格式如下:

raise [Exception [, args [, traceback]]]

  語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是"None"。

最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。

示例:

一個異常可以是一個字元串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。

定義一個異常非常簡單,如下所示:

def functionName( level ):      if level < 1:          raise Exception("Invalid level!", level)          # 觸發異常後,後面的程式碼就不會再執行    try:      raise TypeError('類型錯誤')  except Exception as e:      print(e)

7.自定義異常

  通過創建一個新的異常類,程式可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。

  以下為與BaseException相關的實例,實例中創建了一個類,基類為BaseException,用於在異常觸發時輸出更多的資訊。

  在try語句塊中,用戶自定義的異常後執行except塊語句,變數 e 是用於創建Networkerror類的實例。

class Networkerror(BaseException):      def __init__(self,msg):          self.msg=msg      def __str__(self):          return self.msg    try:      raise Networkerror('類型錯誤')  except Networkerror as e:      print(e)

8.斷言:assert條件

assert 1 == 1  #不會報錯  assert 1 == 2  #會報錯  assert 1 != 1  #會報錯

栗子:

def is_huiwen_num(num):      snum = str(num)      return snum == snum[::-1]    # 如果希望程式中的所有assert語句不執行, 那麼給python -O 腳本名  if __name__ == "__main__":      assert is_huiwen_num(100) == True    #會在這裡直接拋出異常,中斷執行過程      assert  is_huiwen_num(101) == True      print("assert")    運行結果:  Traceback (most recent call last):    File "/home/kiosk/PycharmProjects/python_projects/ttttt.py", line 7, in <module>      assert is_huiwen_num(100) == True  AssertionError

五.常見異常種類

在python中不同的異常可以用不同的類型(python中統一了類與類別,類型即類)取標識,一個異常標識一種錯誤。 常見語法錯誤

AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x    IOError 輸入/輸出異常;基本上是無法打開文件    ImportError 無法引入模組或包;基本上是路徑問題或名稱錯誤    IndentationError 語法錯誤(的子類) ;程式碼沒有正確對齊    IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]    KeyError 試圖訪問字典里不存在的鍵    KeyboardInterrupt Ctrl+C被按下    NameError 使用一個還未被賦予對象的變數    SyntaxError Python程式碼非法,程式碼不能編譯(個人認為這是語法錯誤,寫錯了)    TypeError 傳入對象類型與要求的不符合    UnboundLocalError 試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數,導致你以為正在訪問它    ValueError 傳入一個調用者不期望的值,即使值的類型是正確的

Tags: