異常:由於代碼的邏輯或者語法錯誤導致的程序中斷。
在學習Python的過程當中,大家一定要區分清楚異常和布爾值False
布爾值的False只是一個值,通常代表的是一個條件的不成立,常用於邏輯判斷
比如:
1 num = 2
2 print(num > 3) 3 if num > 3: 4 print("num > 3")
異常指的是由於代碼的邏輯或者語法錯誤導致的程序中斷
比如:
1 num = 2
2 2+"2"
了解了上面的邏輯之后,我們來看看大家在代碼當中經常出現的幾種錯誤,和常見原因
錯誤類型 | 錯誤名稱 | 錯誤解釋 |
SyntaxError | 語法錯誤 | 是語法導致的錯誤,通常的報錯是 invalid syntax,比如:縮進語句塊不加冒號,遇到這種錯誤,就要詳細的檢查自己的的語句了 |
IndexError | 索引錯誤 | 是索引引用導致的錯誤,通常的報錯是 list out of range,遇到這個錯誤就要認真的檢查自己是不是取了一個超出序列長度的索引 |
NameError | 命名錯誤 | 是變量命名導致的錯誤,通常的報錯是 no model named ... ,遇到這個錯誤就要查看自己的變量了,初學者要注意是不是字符串沒有加引號 |
AttributeError | 屬性錯誤 | 是調用對象屬性時候導致的錯誤,通常報錯是 ... object has no attribute ... 遇到這個錯誤就要查看自己的對象是不是調用了不存在的屬性了 |
KeyError | 鍵錯誤 | 是字典取值時候導致的錯誤,字典沒有這個鍵 |
TypeError | 類型錯誤 | 是對對象進行非本類型操作時候導致的,沒有固定的報錯,常見的有 ... not callabel ,遇到這種錯誤,要認真梳理自己對對象的操作了,比如,非函數對象加括號調用 |
當然異常的類型還有好多,在這就不一一列舉了,我們來看捕獲異常的關鍵字
捕獲異常最簡單的寫法如下
try: #嘗試執行縮進下面的報錯
1+"1"
except: #如果發生錯誤,打印Error
print("Error") >>> Error
這里我們嘗試執行 1+“1”,如果可以執行就執行,如果發生錯誤就執行下面的代碼。
但是,在工作當中,這樣的代碼並沒有太好的效果,我們通過這段代碼既無法實現錯誤內容的輸出,也不能實現錯誤的處理,只是讓程序不報錯的執行了下去,這個顯然不好使。
所以我們首先要考慮的就是如何獲取具體的錯誤內容,例子如下:
例1:
try: 1+"1"
except Exception as e: print(e) >>> unsupported operand type(s) for +: 'int' and 'str'
這里我們用到了兩個之前沒有用到過的關鍵詞:
1、Exception 所有的錯誤
2、as 別名
所以例1代碼的含義就是嘗試執行 1+"1”,如果只成功就可以,否則無論發生任何錯誤,都把這個錯誤返回的內容起別名為e,在下面輸出出來。在這里要注意的一點就是,e可以被打印但是不是字符串對象,所以不可以進行任何字符串操作。
try: 1+"1"
except Exception as e: print(type(e)) >>> <class 'TypeError'>
例2:
try: 1+"1"
except TypeError as e: print(e) >>> unsupported operand type(s) for +: 'int' and 'str'
這里和上面的例1唯一的不同就在於except后面跟了具體的錯誤類型,意思很明確,當發生TypeError的時候,我進行如下處理,至於其他錯誤,就讓他報錯去吧。
當然這樣的說法有點隨性,認真的查看,着多種錯誤類型的捕獲異常給我們對同一語句進行不同的異常處理帶來了很大的遍歷性,畢竟不是所有的錯誤都可以pass!
了解了上面的報錯,那么接下來要認真研究的就是捕獲異常的另外兩個關鍵字:else 和finally
首先是他兩的邏輯
else:代表在try執行成功之后,進行執行,放在except的后面
finally:代表最后,無論執行try成功還是失敗,都會執行。作為最后的收尾
了解之后,我們來查看我們例子
例1:
1 try: 2 1+"1"
3 except Exception as e: 4 print(e) 5 else: 6 print("it is ok") 7 finally: 8 print("ok it's over") 9
10 >>> unsupported operand type(s) for +: 'int' and 'str'
11 >>> ok it's over
例2:
1 try: 2 1+1
3 except Exception as e: 4 print(e) 5 else: 6 print("it is ok") 7 finally: 8 print("ok it's over") 9
10 >>> it is ok 11 >>> ok it's over
在例1當中,我們執行try失敗,所以except和finally執行,在例子2當中,我們執行try成功,所以else和finally成功。
else和finally的出現極大的方便了我們對捕獲異常和異常處理的完整流程描述,不如下面的例子
1 import pymysql 2 try: 3 #嘗試連接數據庫
4 connect = pymysql.connect( 5 host = "localhost", 6 user = "root", 7 password = "123", 8 database = "outTest"
9 ) 10 except Exception as e: 11 #失敗輸出錯誤
12 print(e) 13 else: 14 #如果成功進行數據查詢
15 cursor = connect.cursor() 16 cursor.execute("select * from login") 17 all_data = cursor.fetchall() 18 print(all_data) 19 finally: 20 #不論如何進行結束通知
21 print("執行結束")
到這里,可能好多讀者覺得捕獲異常到此結束,其實並不是這樣,還可以有一個好的建議給到大家,我們可以嘗試使用。先看下面的兩個案例:
例1:
try: 1+"1"
except Exception as e: print(e) >>> unsupported operand type(s) for +: 'int' and 'str'
例2:
try: 1+"1"
except Exception as e: error = traceback.format_exc() print(error) >>> Traceback (most recent call last): File "C:/Users/bian/Desktop/TestProject/twistedProject/twistedProject.py", line 67, in <module>
1+"1" TypeError: unsupported operand type(s) for +: 'int' and 'str'
例1和例2同樣實現了捕獲異常的功能,但是例子2的返回更加的專業,並且利於調試