一:語法錯誤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") #從測試代碼