一:語法錯誤syntax errors
熟悉語法!
二:異常
①打印錯誤信息時,異常的類型作為異常的內置名顯示,并以調用棧的形式顯示具體信息
②常見的異常:
NameError、
ZeropisionError、
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使用斷言的最佳時機》
# ---------------------------------------------------------------------# # 異常處理 # ---------------------------------------------------------------------# while True: try: x = int(input("Please enter a number: ")) break except ValueError: print("Oops! That was no valid number. Try again ") # ---------------------------------------------------------------------# # 拋出異常 # ---------------------------------------------------------------------# """ try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise """ # ---------------------------------------------------------------------# # 用戶自定義異常 # ---------------------------------------------------------------------# class MyError(Exception): # 繼承自Exception def __init__(self, value): # 構造函數重寫 self.value = value def __str__(self): return repr(self.value) try: raise MyError(2*2) # 拋出異常 except MyError as e: print('My exception occurred, value:', e.value) # 當創建一個模塊有可能拋出多種不同的異常時, # 一種通常的做法是為這個包建立一個基礎異常類, # 然后基于這個基礎類為不同的錯誤情況創建不同的子類 class Error(Exception): """Base class for exceptions in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the error """ def __init__(self, expression, message): self.expression = expression self.message = message class TransitionError(Error): """Raised when an operation attempts a state transition that's not allowed. Attributes: previous -- state at beginning of transition next -- attempted new state message -- explanation of why the specific transition is not allowed """ def __init__(self, previous, next1, message): self.previous = previous self.next = next1 self.message = message try: raise InputError(2*2, 45) # 拋出異常 except InputError: # 處理異常 print('My exception occurred') # ---------------------------------------------------------------------# # 定義清理行為 # ---------------------------------------------------------------------# def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: # 沒有異常的時執行 print("result is", result) finally: # 無論在任何情況下都會執行的清理行為 print("executing finally clause") # 一個異常在 try 子句里(或者在 except 和 else 子句里)被拋出, # 而又沒有任何的 except 把它截住,那么這個異常會在 finally 子句執行后再次被拋出 # divide("2", "1") #從測試代碼
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com