一:語法錯誤syntax errors
熟悉語法!
二:異常
①打印錯誤信息時(shí),異常的類型作為異常的內(nèi)置名顯示,并以調(diào)用棧的形式顯示具體信息
②常見的異常:
NameError、
ZeropisionError、
TypeError
SyntaxError
IndexError 索引超出序列范圍
KeyError 請求一個不存在的字典關(guān)鍵字
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語句按照如下方式工作;
①首先,執(zhí)行try子句(在關(guān)鍵字try和關(guān)鍵字except之間的語句)
②如果沒有異常發(fā)生,忽略except子句,try子句執(zhí)行后結(jié)束。
③如果在執(zhí)行try子句的過程中發(fā)生了異常,那么try子句余下的部分將被忽略。
④如果異常的類型和 except 之后的名稱相符,那么對應(yīng)的except子句將被執(zhí)行。最后執(zhí)行 try 語句之后的代碼。
⑤如果一個異常沒有與任何的except匹配,那么這個異常將會傳遞給上層的try中。
⑥一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有一個分支會被執(zhí)行。
⑦一個except子句可以同時(shí)處理多個異常,這些異常將被放在一個括號里成為一個元組。
except (RuntimeError, TypeError, NameError): pass
⑧最后一個except子句可以忽略異常的名稱,它將被當(dāng)作通配符使用。你可以使用這種方法打印一個錯誤信息,然后再次把異常拋出。
⑨t(yī)ry except 語句還有一個可選的else子句,如果使用這個子句,那么必須放在所有的except子句之后。這個子句將在try子句沒有發(fā)生任何異常的時(shí)候執(zhí)行.
三:拋出異常
Python 使用 raise 語句拋出一個指定的異常
raise 唯一的一個參數(shù)指定了要被拋出的異常。
它必須是一個異常的實(shí)例或者是異常的類(也就是 Exception 的子類)
四:用戶自定義異常
可以通過創(chuàng)建一個新的異常類來擁有自己的異常。
異常類繼承自 Exception 類,可以直接繼承,或者間接繼承。
當(dāng)創(chuàng)建一個模塊有可能拋出多種不同的異常時(shí),
一種通常的做法是為這個包建立一個基礎(chǔ)異常類,
五:定義清理行為
try: raise KeyboardInterrupt finanlly: print("dooo")
不管 try 子句里面有沒有發(fā)生異常,finally 子句都會執(zhí)行
如果一個異常在 try 子句里(或者在 except 和 else 子句里)被拋出,
而又沒有任何的 except 把它截住,那么這個異常會在 finally 子句執(zhí)行后再次被拋出
六:擴(kuò)展------------->斷言機(jī)制
assert 等價(jià)于布爾真的判定,不滿足拋出異常AssertionError
用途: 防御性的程序
運(yùn)行時(shí)需要邏輯檢查
參考文獻(xiàn):《python使用斷言的最佳時(shí)機(jī)》
# ---------------------------------------------------------------------# # 異常處理 # ---------------------------------------------------------------------# 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): # 構(gòu)造函數(shù)重寫 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) # 當(dāng)創(chuàng)建一個模塊有可能拋出多種不同的異常時(shí), # 一種通常的做法是為這個包建立一個基礎(chǔ)異常類, # 然后基于這個基礎(chǔ)類為不同的錯誤情況創(chuàng)建不同的子類 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: # 沒有異常的時(shí)執(zhí)行 print("result is", result) finally: # 無論在任何情況下都會執(zhí)行的清理行為 print("executing finally clause") # 一個異常在 try 子句里(或者在 except 和 else 子句里)被拋出, # 而又沒有任何的 except 把它截住,那么這個異常會在 finally 子句執(zhí)行后再次被拋出 # divide("2", "1") #從測試代碼
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com