0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python如何捕獲異常和主動(dòng)拋出異常

python爬蟲知識(shí)分享 ? 來源:python爬蟲知識(shí)分享 ? 作者:python爬蟲知識(shí)分享 ? 2022-03-04 17:09 ? 次閱讀

python如何主動(dòng)拋出異常和捕獲異常

1. 如何拋出異常?

異常的產(chǎn)生有兩種來源:

一種是程序自動(dòng)拋出,比如 1/0 會(huì)自動(dòng)拋出 ZeroDivisionError

一種是開發(fā)者主動(dòng)拋出,使用 raise 關(guān)鍵字拋出。

在 Python 中是使用 raise 關(guān)鍵字來拋出異常的,比如在下面這個(gè)函數(shù)中,如果不存在目標(biāo)文件,則會(huì)拋出一個(gè) Exception 通用異常。

def demo_func(filename):
    if not os.path.isfile(filename):
        raise Exception

2. 如何捕獲異常?

出現(xiàn)錯(cuò)誤或者異常沒有關(guān)系,關(guān)鍵在于你要學(xué)會(huì)預(yù)判程序可能會(huì)出現(xiàn)的錯(cuò)誤或異常,然后在代碼中捕獲這些異常并處理。

異常的捕獲的語法有如下四種:

第一種語法

只捕捉但是不想獲取異常信息

try:
    代碼A
except [EXCEPTION]:
    代碼B

第二種語法

不但捕捉了還要獲取異常信息,賦值給 e 后,后面你可以把異常信息打印到日志中。

try:
    代碼A
except [EXCEPTION] as e:
    代碼B

第三種語法

使用 try ... except ... else

如果代碼A發(fā)生了異常,則會(huì)走到代碼B的邏輯,如果沒有發(fā)生異常,則會(huì)走到代碼C

try:
    代碼A
except [exception] as e:
    代碼B
else:
    代碼C

舉個(gè)例子

不發(fā)生異常的情況

>>> try:
...     4/2
... except ZeroDivisionError as e:
...     print("發(fā)生了異常:錯(cuò)誤信息如下: \n" + str(e))
... else:
...     print("程序正常運(yùn)行")
...
2
程序正常運(yùn)行

發(fā)生異常的情況

>>> try:
...     1/0
... except ZeroDivisionError as e:
...     print("發(fā)生了異常:錯(cuò)誤信息如下: \n" + str(e))
... else:
...     print("程序正常運(yùn)行")
...
發(fā)生了異常:錯(cuò)誤信息如下:
integer division or modulo by zero

第四種語法

使用 try ... except ... finally

如果代碼A發(fā)生了異常,則會(huì)走到代碼B的邏輯,最后不管有沒有發(fā)生異常都會(huì)走到代碼C

try: 代碼A except [exception] as e: 代碼B finally: 代碼C

舉個(gè)例子

發(fā)生異常的情況

>>> try:
...     1/0
... except ZeroDivisionError as e:
...     print("發(fā)生了異常:錯(cuò)誤信息如下: \n" + str(e))
... finally:
...     print("程序運(yùn)行結(jié)束!!")
...
發(fā)生了異常:錯(cuò)誤信息如下:
integer division or modulo by zero
程序運(yùn)行結(jié)束!!

不發(fā)生異常的情況

>>> try:
...     4/2
... except ZeroDivisionError as e:
...     print("發(fā)生了異常:錯(cuò)誤信息如下: \n" + str(e))
... finally:
...     print("程序運(yùn)行結(jié)束!!")
...
2
程序運(yùn)行結(jié)束!!

3. 捕獲多個(gè)異常?

每個(gè)except捕獲一個(gè)異常

一個(gè) try 語句可能有多個(gè) except 子句,以指定不同異常的處理程序,但是最多會(huì)執(zhí)行一個(gè)處理程序。

當(dāng)代碼 A 在運(yùn)行中拋出了異常時(shí),Python 解釋器會(huì)逐行運(yùn)行代碼,如果拋出的異常是 exception1 那么后面直接運(yùn)行代碼B,運(yùn)行完 B 后,就不會(huì)再判斷后面兩個(gè) except 語句了。

而如果不是 exception1 ,而是 exception2 ,那會(huì)運(yùn)行代碼C,而不會(huì)再運(yùn)行第三個(gè) except 語句了。

try:
    代碼A
except [exception1] as e:
    代碼B
except [exception2] as e:
    代碼C
except [exception3] as e:
    代碼D

舉個(gè)例子吧,下面這段代碼,由于 1/0 會(huì)拋出 ZeroDivisionError 錯(cuò)誤,所以前面兩個(gè)異常匹配都不成功,而在最后一個(gè) except 成功匹配上,最終打印出 除數(shù)不能為 0

try:
    1/0
except IOError:
    print("IO讀寫出錯(cuò)")
except FloatingPointError:
    # 浮點(diǎn)計(jì)算錯(cuò)誤
    print("計(jì)算錯(cuò)誤")
except ZeroDivisionError:
    # 除數(shù)不能為 0
    print("計(jì)算錯(cuò)誤")
# output: 計(jì)算錯(cuò)誤

一個(gè)except捕獲多個(gè)異常

上面的例子可以看出來,第二個(gè)異常和第三個(gè)異常是屬于同一類,就是 計(jì)算錯(cuò)誤,異常處理的代碼是一樣的,那有沒有辦法將它們合并在一起呢,簡(jiǎn)化一下代碼呢?

答案是,可以的。

在 except 后面其實(shí)是可以接多個(gè)異常的,多個(gè)異常之間使用括號(hào)包裹。只要匹配上一個(gè)就算捕獲到,就會(huì)進(jìn)入相應(yīng)的代碼分支。

try:
    1/0
except IOError:
    print("IO讀寫出錯(cuò)")
except (ZeroDivisionError, FloatingPointError):
    print("計(jì)算出錯(cuò)")
# output: 計(jì)算錯(cuò)誤

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4756

    瀏覽量

    84283
  • 異常
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    9213
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單片機(jī)異常復(fù)位的原因

    單片機(jī)異常復(fù)位是指單片機(jī)在正常工作過程中,非預(yù)期地返回到初始狀態(tài)或重啟。這種異常復(fù)位現(xiàn)象可能由多種因素引起,以下是對(duì)單片機(jī)異常復(fù)位原因的詳細(xì)分析:
    的頭像 發(fā)表于 10-17 17:56 ?94次閱讀

    儀表溫度異常的產(chǎn)生原因

    電子發(fā)燒友網(wǎng)站提供《儀表溫度異常的產(chǎn)生原因.docx》資料免費(fèi)下載
    發(fā)表于 09-12 14:09 ?0次下載

    Panasonic松下焊接電異常處理

    電子發(fā)燒友網(wǎng)站提供《Panasonic松下焊接電異常處理.pdf》資料免費(fèi)下載
    發(fā)表于 08-19 14:24 ?0次下載

    ESP8266使用mDNS后,ESP會(huì)拋出異常怎么解決?

    我在 OTA 實(shí)驗(yàn)中注意到了它。使用 mDNS 后,ESP 會(huì)拋出異常 (0)。它每分鐘正好執(zhí)行此操作 1 次。無論WN523N2是在橋接模式還是中繼器模式下運(yùn)行,都沒有區(qū)別。該錯(cuò)誤僅發(fā)生
    發(fā)表于 07-18 07:27

    叉車can總線異常怎么解決

    ,被廣泛應(yīng)用于叉車控制系統(tǒng)中,實(shí)現(xiàn)了叉車各控制單元之間的高速、可靠通信。然而,在實(shí)際使用過程中,叉車CAN總線可能會(huì)出現(xiàn)各種異常情況,影響叉車的正常使用。 叉車CAN總線異常的原因 叉車CAN總線異常的原因很多,主要包括以下幾
    的頭像 發(fā)表于 06-16 10:56 ?1430次閱讀

    晶振輸出頻率異常怎么辦?

    晶振輸出頻率異常怎么辦? 晶振輸出頻率異常是指晶振輸出信號(hào)的頻率與預(yù)期不符。晶振作為一種常見的時(shí)鐘源,廣泛應(yīng)用于各種電子設(shè)備中,包括計(jì)算機(jī)、手機(jī)、通信設(shè)備等。因此,當(dāng)晶振輸出頻率異常時(shí),會(huì)導(dǎo)致設(shè)備
    的頭像 發(fā)表于 01-24 16:11 ?709次閱讀

    GD32 串口接受異常的幾個(gè)原因

    前面我們介紹過GD32 485發(fā)送時(shí)出現(xiàn)異常的最常見原因,有小伙伴反饋想要知道GD32 串口接受異常的可能原因,今天我們就來安排。
    的頭像 發(fā)表于 01-18 09:57 ?3939次閱讀
    GD32 串口接受<b class='flag-5'>異常</b>的幾個(gè)原因

    如何解決C語言中的“訪問權(quán)限沖突”異常?C語言引發(fā)異常原因分析

    如何解決C語言中的“訪問權(quán)限沖突”異常?C語言引發(fā)異常原因分析? 在C語言中,訪問權(quán)限沖突異常通常是由于嘗試訪問未授權(quán)的變量、函數(shù)或其他數(shù)據(jù)結(jié)構(gòu)而引起的。這種異常是編程中常見的錯(cuò)誤之一
    的頭像 發(fā)表于 01-12 16:03 ?4084次閱讀

    Java怎么排查oom異常

    Java中的OOM(Out of Memory)異常是指當(dāng)Java虛擬機(jī)的堆內(nèi)存不足以容納新的對(duì)象時(shí)拋出異常。OOM異常是一種常見的運(yùn)行時(shí)異常
    的頭像 發(fā)表于 12-05 13:47 ?1121次閱讀

    Java oom異常的原因分析

    Java中的OOM(Out of Memory)異常是指當(dāng)程序在運(yùn)行過程中無法分配足夠的內(nèi)存空間時(shí)拋出異常。在Java中,內(nèi)存分為堆內(nèi)存(Heap)和棧內(nèi)存(Stack)。堆內(nèi)存用于存儲(chǔ)對(duì)象和數(shù)
    的頭像 發(fā)表于 12-05 13:43 ?686次閱讀

    dhcp服務(wù)異常怎么修復(fù)

    DHCP(Dynamic Host Configuration Protocol)是一種網(wǎng)絡(luò)協(xié)議,它能夠自動(dòng)分配 IP 地址和其他網(wǎng)絡(luò)參數(shù)給計(jì)算機(jī)和其他網(wǎng)絡(luò)設(shè)備。然而,有時(shí)候 DHCP 服務(wù)可能會(huì)出現(xiàn)異常
    的頭像 發(fā)表于 11-27 14:53 ?8950次閱讀

    變壓器有異常響聲是什么原因 變壓器異常聲響的原因有哪些?

    變壓器有異常響聲是什么原因 變壓器異常聲響的原因有哪些? 變壓器是電力系統(tǒng)中非常重要的電氣設(shè)備,用于將高電壓變換為低電壓或者低電壓變換為高電壓,以便進(jìn)行輸電或者供電。在變壓器的運(yùn)行過程中,有時(shí)候會(huì)發(fā)
    的頭像 發(fā)表于 11-23 15:34 ?9106次閱讀

    Python 怎么捕獲警告(Warning)?

    不然,異常和錯(cuò)誤,都是程序出現(xiàn)了一些問題,但是警告不同,他的緊急程度非常之低,以致于大多數(shù)的警告都是可以直接忽略的。 如果不想顯示這些告警信息,可以直接加上參數(shù) -W ignore 參數(shù),就不會(huì)再顯示了。 2. 警告能捕獲嗎 能捕獲
    的頭像 發(fā)表于 11-01 10:57 ?945次閱讀
    <b class='flag-5'>Python</b> 怎么<b class='flag-5'>捕獲</b>警告(Warning)?

    工業(yè)設(shè)備振動(dòng) - 基于振動(dòng)的異常探測(cè)

    工業(yè)設(shè)備振動(dòng) - 基于振動(dòng)的異常探測(cè)
    的頭像 發(fā)表于 10-27 16:24 ?413次閱讀
    工業(yè)設(shè)備振動(dòng) - 基于振動(dòng)的<b class='flag-5'>異常</b>探測(cè)

    深入 Cortex‐M3 的 Faults異常

    深入 Cortex‐M3 的 Faults異常
    的頭像 發(fā)表于 10-26 16:57 ?530次閱讀
    深入 Cortex‐M3 的 Faults<b class='flag-5'>異常</b>