python錯誤和異常


一:語法錯誤syntax errors
    
    熟悉語法!

二:異常

    ①打印錯誤信息時,異常的類型做爲異常的內置名顯示,並以調用棧的形式顯示具體信息
    ②常見的異常:
            NameError、
            ZeroDivisionError、
            TypeError
            SyntaxError
            IndexError    索引超出序列範圍
            KeyError    請求一個不存在的字典關鍵字
            IOError        輸入輸出錯誤
            AttributeError    嘗試訪問未知的對象屬性
三:異常處理

    while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")

    try語句按照以下方式工做;
    ①首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
        ②若是沒有異常發生,忽略except子句,try子句執行後結束。
        ③若是在執行try子句的過程當中發生了異常,那麼try子句餘下的部分將被忽略。
    ④若是異常的類型和 except 以後的名稱相符,那麼對應的except子句將被執行。
    最後執行 try 語句以後的代碼。
        ⑤若是一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。


    ⑥一個 try 語句可能包含多個except子句,分別來處理不一樣的特定的異常。
    最多隻有一個分支會被執行。
    ⑦一個except子句能夠同時處理多個異常,這些異常將被放在一個括號裏成爲一個元組。

    except (RuntimeError, TypeError, NameError):
            pass

    ⑧最後一個except子句能夠忽略異常的名稱,它將被看成通配符使用。
    你可使用這種方法打印一個錯誤信息,而後再次把異常拋出。

    ⑨try except 語句還有一個可選的else子句,若是使用這個子句,
    那麼必須放在全部的except子句以後。
    這個子句將在try子句沒有發生任何異常的時候執行.

三:拋出異常
    
    Python 使用 raise 語句拋出一個指定的異常
    raise 惟一的一個參數指定了要被拋出的異常。
    它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)

四:用戶自定義異常

    能夠經過建立一個新的異常類來擁有本身的異常。
    異常類繼承自 Exception 類,能夠直接繼承,或者間接繼承。
    當建立一個模塊有可能拋出多種不一樣的異常時,
    一種一般的作法是爲這個包創建一個基礎異常類,

五:定義清理行爲

    try:
        raise KeyboardInterrupt
    finanlly:
        print("dooo")
    無論 try 子句裏面有沒有發生異常,finally 子句都會執行
    若是一個異常在 try 子句裏(或者在 except 和 else 子句裏)被拋出,
    而又沒有任何的 except 把它截住,那麼這個異常會在 finally 子句執行後再次被拋出

六:擴展------------->斷言機制
    assert 等價於布爾真的斷定,不知足拋出異常AssertionError
    用途:    防護性的程序
        運行時須要邏輯檢查
    參考文獻:《python使用斷言的最佳時機》

python

  1 # ---------------------------------------------------------------------#
  2 # 異常處理
  3 # ---------------------------------------------------------------------#
  4 
  5 while True:
  6     try:
  7         x = int(input("Please enter a number: "))
  8         break
  9     except ValueError:
 10             print("Oops!  That was no valid number.  Try again   ")
 11 
 12 # ---------------------------------------------------------------------#
 13 # 拋出異常
 14 # ---------------------------------------------------------------------#
 15 """
 16 try:
 17     raise NameError('HiThere')
 18 except NameError:
 19     print('An exception flew by!')
 20     raise
 21 """
 22 
 23 # ---------------------------------------------------------------------#
 24 # 用戶自定義異常
 25 # ---------------------------------------------------------------------#
 26 
 27 
 28 class MyError(Exception):   # 繼承自Exception
 29     def __init__(self, value):  # 構造函數重寫
 30         self.value = value
 31 
 32     def __str__(self):
 33         return repr(self.value)
 34 
 35 
 36 try:
 37     raise MyError(2*2)  # 拋出異常
 38 except MyError as e:
 39         print('My exception occurred, value:', e.value)
 40 
 41 # 當建立一個模塊有可能拋出多種不一樣的異常時,
 42 # 一種一般的作法是爲這個包創建一個基礎異常類,
 43 # 而後基於這個基礎類爲不一樣的錯誤狀況建立不一樣的子類
 44 
 45 
 46 class Error(Exception):
 47     """Base class for exceptions in this module."""
 48     pass
 49 
 50 
 51 class InputError(Error):
 52     """Exception raised for errors in the input.
 53 
 54     Attributes:
 55         expression -- input expression in which the error occurred
 56         message -- explanation of the error
 57     """
 58 
 59     def __init__(self, expression, message):
 60         self.expression = expression
 61         self.message = message
 62 
 63 
 64 class TransitionError(Error):
 65     """Raised when an operation attempts a state transition that's not
 66     allowed.
 67 
 68     Attributes:
 69         previous -- state at beginning of transition
 70         next -- attempted new state
 71         message -- explanation of why the specific transition is not allowed
 72     """
 73 
 74     def __init__(self, previous, next1, message):
 75         self.previous = previous
 76         self.next = next1
 77         self.message = message
 78 
 79 
 80 try:
 81     raise InputError(2*2, 45)   # 拋出異常
 82 except InputError:         # 處理異常
 83         print('My exception occurred')
 84 
 85 # ---------------------------------------------------------------------#
 86 # 定義清理行爲
 87 # ---------------------------------------------------------------------#
 88 
 89 
 90 def divide(x, y):
 91     try:
 92         result = x / y
 93     except ZeroDivisionError:
 94         print("division by zero!")
 95     else:                           # 沒有異常的時執行
 96         print("result is", result)
 97     finally:                        # 不管在任何狀況下都會執行的清理行爲
 98         print("executing finally clause")
 99 
100 
101 # 一個異常在 try 子句裏(或者在 except 和 else 子句裏)被拋出,
102 # 而又沒有任何的 except 把它截住,那麼這個異常會在 finally 子句執行後再次被拋出
103 # divide("2", "1")   #從測試代碼
相關文章
相關標籤/搜索