Python常遇到的錯(cuò)誤和異常
在日常的學(xué)習(xí)Python過程中,由于本身的編程水平受限,時(shí)不時(shí)的給我拋出一個(gè)異常讓我真的很難受;在學(xué)習(xí)的過程中發(fā)現(xiàn)Python中的錯(cuò)誤分為語法錯(cuò)誤和異常兩種。
1、語法錯(cuò)誤
Python中的語法錯(cuò)誤通常是最為明顯的錯(cuò)誤了,由于不按照要求書寫代碼,往往就容易出現(xiàn)語法錯(cuò)誤
示例代碼:
>>> 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的語法解釋器會(huì)找出最先出現(xiàn)錯(cuò)誤的位置,并在其下面標(biāo)記一個(gè)小小的箭頭
2、異常
什么是異常?異常就是一個(gè)事件,該事件會(huì)在程序的運(yùn)行過程中發(fā)生,影響程序的正常執(zhí)行;因?yàn)?code>Python中萬物皆對(duì)象,所以異常也是一個(gè)對(duì)象,就表示一個(gè)錯(cuò)誤;一般情況下即使Python語法是正確的,在運(yùn)行它的時(shí)候,也有可能發(fā)生錯(cuò)誤,運(yùn)行期檢測到的錯(cuò)誤被稱為異常。
示例:
>>> 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
不同的異常就會(huì)提示不同的錯(cuò)誤信息,錯(cuò)誤信息的前面部分顯示了異常發(fā)生的上下文,并以調(diào)用棧的形式顯示具體信息。
3、異常處理
當(dāng)Python腳本發(fā)生異常時(shí)我們沒有及時(shí)捕獲處理它,程序會(huì)終止執(zhí)行。python中使用try/except語句就可以很好的來處理異常。
示例代碼:
try:
print(my_name) # 沒有定義my_nama變量,就會(huì)發(fā)生異常
print("我是正常執(zhí)行的結(jié)果") # 如果程序正常就會(huì)執(zhí)行此代碼
except NameError:
print("如果發(fā)生異常,就會(huì)執(zhí)行我") # 如果發(fā)生錯(cuò)誤就會(huì)執(zhí)行此段代碼
執(zhí)行流程:



執(zhí)行執(zhí)行 try 子句(在關(guān)鍵字 try 和關(guān)鍵字 except 之間的語句)
沒有找到變量,引發(fā)NameError錯(cuò)誤
異常類型正好和except后面的語句相符合,應(yīng)的 except 子句將被執(zhí)行
注意:如果異常與之不符合,還是會(huì)拋出異常
如果想要一個(gè)except子句可以同時(shí)處理多個(gè)異常,這些異常將被放在一個(gè)括號(hào)里成為一個(gè)元組,
例如:
try:
pass
except (RuntimeError, TypeError, NameError):
pass
一個(gè)try語句也可以包含多個(gè)except子句,分別來處理不同的特定的異常。最多只有一個(gè)分支會(huì)被執(zhí)行。
最后一個(gè)except子句可以忽略異常的名稱,它將被當(dāng)作通配符使用??梢酝ㄟ^raise將異常拋出
示例代碼;
while True:
try:
a = int(input("請(qǐng)輸入被除數(shù):"))
b = int(input("請(qǐng)輸入被除數(shù):"))
c = a / b
print("結(jié)果為:", c)
break # 跳出循環(huán)
except ValueError:
print("輸入的不是一個(gè)數(shù)字,請(qǐng)重新輸入")
except:
print("未知異常")
raise # 如果不是ValueError,會(huì)打印上一條語句并拋出異常
執(zhí)行流程:

4、try/except...else
try/except 語句還有一個(gè)可選的 else 子句,想要使用這個(gè)子句,就必須放在所有的 except 子句之后。
else 子句將在 try 子句沒有發(fā)生任何異常的時(shí)候執(zhí)行。
執(zhí)行流程:
示例代碼:
while True:
try:
a = int(input("請(qǐng)輸入被除數(shù):"))
b = int(input("請(qǐng)輸入被除數(shù):"))
except ValueError:
print("輸入的不是一個(gè)數(shù)字,請(qǐng)重新輸入")
except ZeroDivisionError:
print("被除數(shù)為0")
else:
c = a / b
print("結(jié)果為:", c)
print('計(jì)算完畢')
break
這里出現(xiàn)了一個(gè)小問題,如果在一個(gè)死循環(huán)的語句中,try中有break關(guān)鍵字,就不會(huì)執(zhí)行else語句
使用 else 子句比把所有的語句都放在 try 子句里面要好,這樣可以避免一些意想不到,而 except 又無法捕獲的異常。
5、try-finally 語句
try-finally 語句無論是否發(fā)生異常都將執(zhí)行最后的代碼。
while True:
try:
a = int(input("請(qǐng)輸入被除數(shù):"))
b = int(input("請(qǐng)輸入被除數(shù):"))
except ValueError:
print("輸入的不是一個(gè)數(shù)字,請(qǐng)重新輸入")
except ZeroDivisionError:
print("被除數(shù)為0")
else:
c = a / b
print("結(jié)果為:", c)
print('計(jì)算完畢')
break
finally:
print("程序執(zhí)行完畢") # 這句話,無論異常是否發(fā)生都會(huì)執(zhí)行
6、拋出異常
Python 使用 raise 語句拋出一個(gè)指定的異常
語法結(jié)構(gòu):
raise [Exception [, args [, traceback]]]
Exception是異常的類型(例如,NameError)參數(shù)標(biāo)準(zhǔn)異常中任一種
args 是自已提供的異常參數(shù)(可選)。
tracebackargs 是跟蹤異常對(duì)象(可選)。
示例代碼:
x = int(input()) # 獲取一個(gè)數(shù)字
if x == 0:
# 如果等于0就拋出Exception異常
raise Exception('x等于0。') # Exception: x等于0。
之前的代碼有個(gè)bug,被除數(shù)為0時(shí)就直接拋出異常,一個(gè)通過這種方法解決
while True:
try:
a = int(input("請(qǐng)輸入被除數(shù):"))
b = int(input("請(qǐng)輸入被除數(shù):"))
if b == 0:
raise ZeroDivisionError('被除數(shù)等于0。')
except ValueError as e: # 將異常信息傳遞給e
print(e) # 將異常信息打印出來
print("輸入的不是一個(gè)數(shù)字,請(qǐng)重新輸入")
except ZeroDivisionError:
print("被除數(shù)為0")
else:
c = a / b
print("結(jié)果為:", c)
print('計(jì)算完畢')
break
finally:
print("程序執(zhí)行完畢") # 這句話,無論異常是否發(fā)生都會(huì)執(zhí)行
dxcept...as...可以將異常信息傳遞出來
7、用戶自定義異常
可以通過創(chuàng)建一個(gè)新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承
示例代碼:
# 自定義一個(gè)異常類
class MyError(Exception): # 異常類繼承自 Exception 類
"""
自己定義的一個(gè)異常類
"""
def __init__(self, message):
self.message = message
raise MyError("自己定義的一個(gè)異常類")
到此這篇關(guān)于Python常遇到的錯(cuò)誤和異常的文章就介紹到這了,更多相關(guān)Python錯(cuò)誤和異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TensorFlow車牌識(shí)別完整版代碼(含車牌數(shù)據(jù)集)
這篇文章主要介紹了TensorFlow車牌識(shí)別完整版代碼(含車牌數(shù)據(jù)集),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python3爬蟲關(guān)于識(shí)別點(diǎn)觸點(diǎn)選驗(yàn)證碼的實(shí)例講解
在本篇文章里小編給大家整理了關(guān)于Python3爬蟲關(guān)于識(shí)別點(diǎn)觸點(diǎn)選驗(yàn)證碼的實(shí)例講解內(nèi)容,需要的朋友們可以參考下。2020-07-07
python 計(jì)算數(shù)據(jù)偏差和峰度的方法
今天小編就為大家分享一篇python 計(jì)算數(shù)據(jù)偏差和峰度的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
公眾號(hào)接入chatGPT的詳細(xì)教程 附Python源碼
這篇文章主要介紹了公眾號(hào)接入chatGPT教程附Python源碼,這里需要大家準(zhǔn)備一個(gè)域名,一臺(tái)服務(wù)器和一個(gè)公眾號(hào),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Python列表推導(dǎo)式實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Python列表推導(dǎo)式實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Python中的random.choices函數(shù)用法詳解
這篇文章主要給大家介紹了關(guān)于Python中random.choices函數(shù)用法的相關(guān)資料,random.random()?的功能是隨機(jī)返回一個(gè)?0-1范圍內(nèi)的浮點(diǎn)數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

