Python常遇到的錯誤和異常
在日常的學(xué)習(xí)Python
過程中,由于本身的編程水平受限,時不時的給我拋出一個異常讓我真的很難受;在學(xué)習(xí)的過程中發(fā)現(xiàn)Python
中的錯誤分為語法錯誤和異常兩種。
1、語法錯誤
Python
中的語法錯誤通常是最為明顯的錯誤了,由于不按照要求書寫代碼,往往就容易出現(xiàn)語法錯誤
示例代碼:
>>> print("hello world) File "<stdin>", line 1 print("hello world) ^ SyntaxError: EOL while scanning string literal >>> while True print("hello world") File "<stdin>", line 1 while True print("hello world") ^ SyntaxError: invalid syntax
Python
的語法解釋器會找出最先出現(xiàn)錯誤的位置,并在其下面標(biāo)記一個小小的箭頭
2、異常
什么是異常?異常就是一個事件,該事件會在程序的運行過程中發(fā)生,影響程序的正常執(zhí)行;因為Python
中萬物皆對象,所以異常也是一個對象,就表示一個錯誤;一般情況下即使Python
語法是正確的,在運行它的時候,也有可能發(fā)生錯誤,運行期檢測到的錯誤被稱為異常。
示例:
>>> print(1 / 0) # 0 不能作為除數(shù),觸發(fā)異常 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> print(my_name) # # my_name 未定義,觸發(fā)異常 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'my_name' is not defined >>> print("5" + 5) # # int 不能與 str 相加,觸發(fā)異常 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str
不同的異常就會提示不同的錯誤信息,錯誤信息的前面部分顯示了異常發(fā)生的上下文,并以調(diào)用棧的形式顯示具體信息。
3、異常處理
當(dāng)Python
腳本發(fā)生異常時我們沒有及時捕獲處理它,程序會終止執(zhí)行。python
中使用try/except
語句就可以很好的來處理異常。
示例代碼:
try: print(my_name) # 沒有定義my_nama變量,就會發(fā)生異常 print("我是正常執(zhí)行的結(jié)果") # 如果程序正常就會執(zhí)行此代碼 except NameError: print("如果發(fā)生異常,就會執(zhí)行我") # 如果發(fā)生錯誤就會執(zhí)行此段代碼
執(zhí)行流程:
執(zhí)行執(zhí)行 try
子句(在關(guān)鍵字 try 和關(guān)鍵字 except 之間的語句)
沒有找到變量,引發(fā)NameError
錯誤
異常類型正好和except
后面的語句相符合,應(yīng)的 except
子句將被執(zhí)行
注意:如果異常與之不符合,還是會拋出異常
如果想要一個except
子句可以同時處理多個異常,這些異常將被放在一個括號里成為一個元組,
例如:
try: pass except (RuntimeError, TypeError, NameError): pass
一個try
語句也可以包含多個except
子句,分別來處理不同的特定的異常。最多只有一個分支會被執(zhí)行。
最后一個except
子句可以忽略異常的名稱,它將被當(dāng)作通配符使用??梢酝ㄟ^raise
將異常拋出
示例代碼;
while True: try: a = int(input("請輸入被除數(shù):")) b = int(input("請輸入被除數(shù):")) c = a / b print("結(jié)果為:", c) break # 跳出循環(huán) except ValueError: print("輸入的不是一個數(shù)字,請重新輸入") except: print("未知異常") raise # 如果不是ValueError,會打印上一條語句并拋出異常
執(zhí)行流程:
4、try/except...else
try/except
語句還有一個可選的 else
子句,想要使用這個子句,就必須放在所有的 except
子句之后。
else
子句將在 try
子句沒有發(fā)生任何異常的時候執(zhí)行。
執(zhí)行流程:
示例代碼:
while True: try: a = int(input("請輸入被除數(shù):")) b = int(input("請輸入被除數(shù):")) except ValueError: print("輸入的不是一個數(shù)字,請重新輸入") except ZeroDivisionError: print("被除數(shù)為0") else: c = a / b print("結(jié)果為:", c) print('計算完畢') break
這里出現(xiàn)了一個小問題,如果在一個死循環(huán)的語句中,try
中有break
關(guān)鍵字,就不會執(zhí)行else
語句
使用 else
子句比把所有的語句都放在 try
子句里面要好,這樣可以避免一些意想不到,而 except
又無法捕獲的異常。
5、try-finally 語句
try-finally
語句無論是否發(fā)生異常都將執(zhí)行最后的代碼。
while True: try: a = int(input("請輸入被除數(shù):")) b = int(input("請輸入被除數(shù):")) except ValueError: print("輸入的不是一個數(shù)字,請重新輸入") except ZeroDivisionError: print("被除數(shù)為0") else: c = a / b print("結(jié)果為:", c) print('計算完畢') break finally: print("程序執(zhí)行完畢") # 這句話,無論異常是否發(fā)生都會執(zhí)行
6、拋出異常
Python
使用 raise
語句拋出一個指定的異常
語法結(jié)構(gòu):
raise [Exception [, args [, traceback]]]
Exception
是異常的類型(例如,NameError)參數(shù)標(biāo)準(zhǔn)異常中任一種
args
是自已提供的異常參數(shù)(可選)。
tracebackargs
是跟蹤異常對象(可選)。
示例代碼:
x = int(input()) # 獲取一個數(shù)字 if x == 0: # 如果等于0就拋出Exception異常 raise Exception('x等于0。') # Exception: x等于0。
之前的代碼有個bug
,被除數(shù)為0時就直接拋出異常,一個通過這種方法解決
while True: try: a = int(input("請輸入被除數(shù):")) b = int(input("請輸入被除數(shù):")) if b == 0: raise ZeroDivisionError('被除數(shù)等于0。') except ValueError as e: # 將異常信息傳遞給e print(e) # 將異常信息打印出來 print("輸入的不是一個數(shù)字,請重新輸入") except ZeroDivisionError: print("被除數(shù)為0") else: c = a / b print("結(jié)果為:", c) print('計算完畢') break finally: print("程序執(zhí)行完畢") # 這句話,無論異常是否發(fā)生都會執(zhí)行
dxcept...as...
可以將異常信息傳遞出來
7、用戶自定義異常
可以通過創(chuàng)建一個新的異常類來擁有自己的異常。異常類繼承自 Exception
類,可以直接繼承,或者間接繼承
示例代碼:
# 自定義一個異常類 class MyError(Exception): # 異常類繼承自 Exception 類 """ 自己定義的一個異常類 """ def __init__(self, message): self.message = message raise MyError("自己定義的一個異常類")
到此這篇關(guān)于Python常遇到的錯誤和異常的文章就介紹到這了,更多相關(guān)Python錯誤和異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm中使用anaconda部署python環(huán)境的方法步驟
這篇文章主要介紹了pycharm中使用anaconda部署python環(huán)境的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12python?groupby函數(shù)實現(xiàn)分組選取最大值與最小值
這篇文章主要介紹了python?groupby函數(shù)實現(xiàn)分組選取最大值與最小值,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08詳解Python之Scrapy爬蟲教程NBA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫
這篇文章主要介紹了詳解Python之Scrapy爬蟲教程NBA球員數(shù)據(jù)存放到Mysql數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01