欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python基礎(chǔ)教程之異常處理詳解

 更新時(shí)間:2023年04月01日 09:55:01   作者:府學(xué)路18號(hào)車神  
Python的異常處理能力是很強(qiáng)大的,它有很多內(nèi)置異常,可向用戶準(zhǔn)確反饋出錯(cuò)信息,下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之異常處理的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

最近發(fā)現(xiàn)有些東西長(zhǎng)時(shí)間不用就要忘了,堅(jiān)持每天復(fù)習(xí)總結(jié)一個(gè)小知識(shí)點(diǎn)吧~

異常是什么呢?就是在代碼執(zhí)行過程中非預(yù)期的執(zhí)行結(jié)果,隨著代碼越來越復(fù)雜,代碼中的執(zhí)行邏輯也會(huì)越來越復(fù)雜,如果沒有處理好異常情況,很有可能造成軟件執(zhí)行錯(cuò)誤,導(dǎo)致重大損失。相反,如果合理的處理異常情況,則可以增強(qiáng)軟件的穩(wěn)定性,提高體驗(yàn)感。

異常

Python中,使用異常對(duì)象(exception object)來表示代碼執(zhí)行過程中所發(fā)生的異常情況,當(dāng)執(zhí)行程序爆出錯(cuò)誤的時(shí)候則會(huì)拋出異常。

如果沒有正確處理異常,則會(huì)終止運(yùn)行。

你可以想象一下,如果你在開發(fā)一款產(chǎn)品時(shí),出現(xiàn)異常而不報(bào)告出發(fā)生異常的原因,是不是會(huì)很難受,也很難解決異常的問題。

為了提高產(chǎn)品的穩(wěn)定性與靈活性,Python運(yùn)行開發(fā)者捕捉并處理各類異常,一般的內(nèi)部模塊報(bào)錯(cuò)如KeyError異常類較為常見,當(dāng)然也有很多其他的。

錯(cuò)誤與異常

簡(jiǎn)單了解下,Python將代碼執(zhí)行錯(cuò)誤分為兩類:語法錯(cuò)誤(syntax error)和異常(exception)。

語法錯(cuò)誤

首先,是語法錯(cuò)誤的問題。字面可知,代碼解析錯(cuò)誤。

這種錯(cuò)誤通常出現(xiàn)在初學(xué)者,主要原因是所執(zhí)行的代碼不符合Python語法的規(guī)范,故會(huì)報(bào)出語法錯(cuò)誤導(dǎo)致code停機(jī)。

下面給出一個(gè)錯(cuò)誤示范:

>>> if for not in list(1,2,3,4)
  File "<stdin>", line 1
    if for not in list(1,2,3,4)
       ^
SyntaxError: invalid syntax

從上面的報(bào)錯(cuò)中可以知道是語法錯(cuò)誤,無效的語法。并且指出了錯(cuò)誤的地方在for的位置,很顯然iffor不能用在一起。

異常

異常則是在代碼執(zhí)行過程中發(fā)現(xiàn)的錯(cuò)誤,這是很難提前被發(fā)現(xiàn)的,即使代碼寫的很規(guī)范標(biāo)準(zhǔn),但也可能會(huì)出現(xiàn)執(zhí)行異常的情況。

下面給出一個(gè)錯(cuò)誤示例。經(jīng)常被提到的是除數(shù)為0的情況,數(shù)學(xué)運(yùn)算中,0是不可以作為除數(shù)的,如果作為除數(shù)則會(huì)爆出異常。

>>> a = 5 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

很明顯報(bào)錯(cuò)指出0作為除數(shù)是不對(duì)的。

異常處理

當(dāng)我們了解了錯(cuò)誤和異常后,就得處理異常情況。對(duì)于語法錯(cuò)誤這種問題多多練習(xí)即可避免,對(duì)于第二種異常,python給出了try-except語句來處理。

為了更清晰的解釋,還是以上面的除數(shù)為0的情況作為例子,我們通過添加try-except語句捕捉并處理異常情況:

def division(x, y):
	try:
		return x / y
	except ZeroDivisionError:
		print("0不能作為除數(shù)?。。?)

然后我們?cè)僭趖erminal調(diào)用函數(shù)試試:

division(x=1, y=0)

輸出:

0不能作為除數(shù)?。?!

雖然我們的輸入是錯(cuò)誤的理論應(yīng)該報(bào)錯(cuò),但是并沒有報(bào)錯(cuò)而且還返回了一段話。

下面解釋一下try-except語句的工作原理:

  1. Try-except中的代碼會(huì)被正常執(zhí)行
  2. 如果沒有出現(xiàn)異常則跳過except代碼塊并結(jié)束try-except
  3. 如果try-except中的某一句代碼出現(xiàn)了問題異常,剩余代碼停止執(zhí)行,如果出現(xiàn)的異常與except所指定的一致,則執(zhí)行except中的代碼塊,異常處理結(jié)束整個(gè)應(yīng)用程序繼續(xù)執(zhí)行
  4. 如果出現(xiàn)的異常與except中指定的不符合,那么則跳出try語句,程序繼續(xù)拋出異常并終止執(zhí)行代碼

當(dāng)然,我們寫的代碼可能不止出現(xiàn)一種異常情況,我們可以將所有異常寫在一個(gè)except語句中,如下所示:

except (RuntimeError, TypeError, NameError):pass

如果捕捉到異常列表中的任意一項(xiàng)異常表達(dá)式,則都會(huì)進(jìn)入except處理。

當(dāng)然,如果你想對(duì)每一種異常進(jìn)行單獨(dú)處理也可以一個(gè)一個(gè)的分開進(jìn)行處理:

def passpass(x=1):
	try:
		return print(x+x)
	except (RuntimeError, TypeError, NameError):
		pass
	except TypeError:
		print('參數(shù)錯(cuò)誤啦~')
	except NameError:
		print('名稱錯(cuò)誤啦~')

今天先到這里明兒再更,去跳繩了,哎,每天卷卷卷,老北京雞內(nèi)卷啊~(2022.4.20)

Python的異常類型是可以繼承的, 我們?cè)诖藘H需知道,若except后指定的異常繼承自前面異常,由此后面的異常也會(huì)被捕捉到,示例如下:

class A(Exception):
	pass
class B(A):
	pass
class C(B):
	pass

for cls in [A, B, C]:
	try:
		raise cls()
	except C:
		print('C')
	except B:
		print('B')
	except A:
		print('A')

則會(huì)輸出:

A
B
C

相反,如果把except的順序倒過來,則只會(huì)輸出A,由于異常B和C都繼承來自A,由此在捕捉到B異常后則會(huì)終止:

class A(Exception):
	pass
class B(A):
	pass
class C(B):
	pass

for cls in [A, B, C]:
	try:
		raise cls()
	except A:
		print('A')
	except B:
		print('B')
	except C:
		print('C')

輸出全為A:

A
A
A

如果所有異常都一一的提取出來,這會(huì)很麻煩,此時(shí)可以在最后的一個(gè)except中不設(shè)置異常類型,由此剩下沒有被捕獲的異常全會(huì)被捕捉:

def passpass(x=1):
	try:
		return print(x/x)

	except TypeError:
		print('參數(shù)錯(cuò)誤啦~')
	except NameError:
		print('名稱錯(cuò)誤啦~')
	except:
		print('報(bào)錯(cuò)啦~自己查')

一個(gè)重要功能:else.

else語句則是用來執(zhí)行一些額外操作,如try代碼塊中執(zhí)行了一些文件操作,在else中可以釋放資源,else的語法格式如下:

try:
	pass
except:
	pass
else:
	pass

當(dāng)然我們還可以操作異常,如下:

def passpass(x=1):
	try:
		return print(x/x)

	except TypeError as error:
		print('參數(shù)錯(cuò)誤啦~', error)
	except NameError:
		print('名稱錯(cuò)誤啦~')
	except:
		print('報(bào)錯(cuò)啦~自己查')

自主拋出異常

開發(fā)者在平常的有些情況下并沒有執(zhí)行錯(cuò)誤,但是不符合設(shè)計(jì)邏輯,由此需要開發(fā)者主動(dòng)拋出異常,這時(shí)我們需要使用raise語句拋出異常:

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: HiThere

自定義異常

Python內(nèi)置異常無法滿足開發(fā)需求的時(shí)候,可以自定義異常。

自定義異常類必須要直接或間接繼承自Exception類。自定義異常類可以像其他類一樣做任何事情,但原則上要保持簡(jiǎn)潔,提高一些屬性即可。

class Error(Exception):
	"""Base class for exception 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 winerror

	"""
	def __init__(self, expression, message):
		self.expression = expression
		self.message = message

finally子句

else在代碼正常執(zhí)行后才會(huì)被執(zhí)行的代碼塊,但有些情況無論代碼塊是否出現(xiàn)異常都要執(zhí)行,則需要用到finally語句:

def passpass(x=1):
	try:
		return print(x/x)

	except TypeError as error:
		print('參數(shù)錯(cuò)誤啦~', error)
	except NameError:
		print('名稱錯(cuò)誤啦~')
	except:
		print('報(bào)錯(cuò)啦~自己查')
	finally:
		print('運(yùn)算結(jié)束~')

總結(jié)

到此這篇關(guān)于Python基礎(chǔ)教程之異常處理的文章就介紹到這了,更多相關(guān)Python異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pandas中resample方法詳解

    Pandas中resample方法詳解

    這篇文章主要介紹了Pandas中resample方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python3.10中match-case的用法和示例詳解

    Python3.10中match-case的用法和示例詳解

    在?Python?3.10?中引入了新的?match-case?語法,它是一種用于模式匹配的結(jié)構(gòu),下面小編就來和大家簡(jiǎn)單聊聊match-case的用法和示例吧,有需要的小伙伴可以參考下
    2023-10-10
  • Python集合union()函數(shù)使用實(shí)例詳解

    Python集合union()函數(shù)使用實(shí)例詳解

    union()方法的工作原理是:返回多個(gè)集合(集合的數(shù)量大于等于2)的并集,即結(jié)果集合包含了所有被合并集合中的所有元素,因?yàn)榧现械脑夭豢芍貜?fù),所以各個(gè)集合中重復(fù)的元素在結(jié)果集合中只會(huì)出現(xiàn)一次,本文將簡(jiǎn)單介紹一下Python union()函數(shù)使用方法
    2023-07-07
  • Python?async+request與async+aiohttp實(shí)現(xiàn)異步網(wǎng)絡(luò)請(qǐng)求探索

    Python?async+request與async+aiohttp實(shí)現(xiàn)異步網(wǎng)絡(luò)請(qǐng)求探索

    這篇文章主要介紹了Python?async+request與async+aiohttp實(shí)現(xiàn)異步網(wǎng)絡(luò)請(qǐng)求探索,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例

    Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例

    本文主要介紹了Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 解決在pycharm運(yùn)行代碼,調(diào)用CMD窗口的命令運(yùn)行顯示亂碼問題

    解決在pycharm運(yùn)行代碼,調(diào)用CMD窗口的命令運(yùn)行顯示亂碼問題

    今天小編就為大家分享一篇解決在pycharm運(yùn)行代碼,調(diào)用CMD窗口的命令運(yùn)行顯示亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python爬蟲實(shí)現(xiàn)POST request payload形式的請(qǐng)求

    python爬蟲實(shí)現(xiàn)POST request payload形式的請(qǐng)求

    這篇文章主要介紹了python爬蟲實(shí)現(xiàn)POST request payload形式的請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python 爬取壁紙網(wǎng)站的示例

    python 爬取壁紙網(wǎng)站的示例

    這篇文章主要介紹了python 爬取壁紙網(wǎng)站的示例,幫助大家更好的理解和學(xué)習(xí)使用python爬蟲,感興趣的朋友可以了解下
    2021-03-03
  • python中setuptools的作用是什么

    python中setuptools的作用是什么

    在本篇文章里小編給大家分享的是一篇關(guān)于python中setuptools的作用以及相關(guān)用法,需要的朋友們可以跟著學(xué)習(xí)下。
    2020-06-06
  • flask 實(shí)現(xiàn)上傳圖片并縮放作為頭像的例子

    flask 實(shí)現(xiàn)上傳圖片并縮放作為頭像的例子

    今天小編就為大家分享一篇flask 實(shí)現(xiàn)上傳圖片并縮放作為頭像的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評(píng)論