亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python學(xué)習(xí)之異常處理詳解

 更新時(shí)間:2022年03月14日 10:10:44   作者:渴望力量的哈士奇  
正常情況下,我們的程序是自上而下的逐行執(zhí)行,執(zhí)行到最后一行才會(huì)終止程序的執(zhí)行。而異常的情況會(huì)導(dǎo)致我們的程序半途而廢停止了執(zhí)行。本文將通過(guò)示例詳細(xì)講解Python中的異常處理,感興趣的可以學(xué)習(xí)一下

本章節(jié)主要學(xué)習(xí) python 中的異常處理,來(lái)看一下該章節(jié)的內(nèi)容有哪些。首先我們需要了解 什么是異常與異常的處理 ,然后再繼續(xù) 異常的語(yǔ)法結(jié)構(gòu)

什么是異常與異常處理

異常 —> 可以理解為不同尋常。

正常情況下,我們的程序是自上而下的逐行執(zhí)行,執(zhí)行到最后一行才會(huì)終止程序的執(zhí)行。而異常的情況會(huì)導(dǎo)致我們的程序半途而廢停止了執(zhí)行。一般情況下的停止執(zhí)行都是因?yàn)槲覀兊某绦虺鲥e(cuò)而造成的,而異常就是錯(cuò)誤,異常的出現(xiàn)會(huì)導(dǎo)致我們的程序崩潰并停止運(yùn)行。這在我們的工作中是非常不友好的!

縱觀程序的一生,都不能保證說(shuō)程序一定不會(huì)出錯(cuò)。所以當(dāng)遇到錯(cuò)誤的時(shí)候,為了不影響程序的執(zhí)行,我們就需要對(duì)這些異常進(jìn)行處理, Python 中的異常機(jī)制,可以監(jiān)控并捕獲到異常。當(dāng)程序出現(xiàn)錯(cuò)誤的時(shí)候?qū)Ξ惓_M(jìn)行臨時(shí)妥善的處理,就可以使得程序繼續(xù)正常的運(yùn)行。

總結(jié):

異常的本質(zhì)就是錯(cuò)誤

異常的出現(xiàn)會(huì)導(dǎo)致程序的崩潰且會(huì)停止執(zhí)行

監(jiān)控異常并捕獲,將造成異常的程序進(jìn)行妥善的處理可以使得程序能夠繼續(xù)正常的運(yùn)行

接下來(lái)我們就快快的看一下 究竟如何捕獲異常并進(jìn)行異常處理的語(yǔ)法吧。

異常的語(yǔ)法

try:                   # 異常的關(guān)鍵字,嘗試的意思
    <代碼塊1>               # 被 try 關(guān)鍵字檢查并保護(hù)的業(yè)務(wù)代碼塊
    
except <異常的類(lèi)型>:         # 發(fā)現(xiàn)異常后的處理關(guān)鍵字,會(huì)跟隨一個(gè)錯(cuò)誤類(lèi)型(異常類(lèi)型),異常類(lèi)型可以不填寫(xiě)
    <代碼塊2>               # try 的代碼塊出現(xiàn)錯(cuò)誤之后,就會(huì)執(zhí)行 except 的代碼塊
                       # 這里一般都是當(dāng) try 代碼塊出現(xiàn)錯(cuò)誤之后的補(bǔ)救邏輯

來(lái)看一個(gè)簡(jiǎn)單的示例:

1 / 0		# 我們都知道 0 不能被整除,所以產(chǎn)生了下面這樣的報(bào)錯(cuò)

# >>> 執(zhí)行結(jié)果如下
# >>> ZeroDivisionError: division by zero 

# >>> 我們管代碼的報(bào)錯(cuò)叫做 異常的拋出 ,這個(gè)報(bào)錯(cuò)信息告訴了我們?yōu)槭裁磮?bào)錯(cuò),同時(shí)業(yè)務(wù)也會(huì)被停止。
# >>> 在程序中,我們是允許出錯(cuò)的,但是需要對(duì)可能遇見(jiàn)的異常捕獲,
# >>> 進(jìn)行合理的處理,讓程序遇到異常可以合理的運(yùn)行

看一下針對(duì)上文示例的異常進(jìn)行的捕獲

try:
    1 / 0
except:
    print('注意:0 不可以被 1 整除')
    print('ZeroDivisionError: division by zero 已捕獲,程序繼續(xù)執(zhí)行')

# >>> 執(zhí)行結(jié)果如下
# >>> 注意:0 不可以被 1 整除
# >>> ZeroDivisionError: division by zero 已捕獲,程序繼續(xù)執(zhí)行

# >>> 雖然 try 代碼塊拋出了異常,但是我們通過(guò) except 進(jìn)行了合理的規(guī)避,使得我們的程序繼續(xù)向下執(zhí)行

接下來(lái)我們?cè)倮梦覀冎皩W(xué)到的知識(shí)點(diǎn) upper() 函數(shù)做一個(gè)小案例:

定義一個(gè) upper ,利用 upper() 函數(shù) 。將傳入的字符串轉(zhuǎn)為大寫(xiě),如傳入?yún)?shù)非 字符串 ,捕獲該異常并處理。

def upper(str_data):
    new_str = None

    try:
        new_str = str_data.upper()
    except:
        print('upper() 函數(shù)轉(zhuǎn)換字符大寫(xiě)失敗!', '返回結(jié)果為:', new_str)
    return new_str


result = upper('test')
print('傳入?yún)?shù)返回值為:', result)

# >>> 執(zhí)行結(jié)果如下:
# >>> 傳入?yún)?shù)返回值為: TEST


result = upper(1)
print(result)

# >>> 執(zhí)行結(jié)果如下:
# >>> upper() 函數(shù)轉(zhuǎn)換字符大寫(xiě)失??! 返回結(jié)果為: None

捕獲通用異常

剛剛我們通過(guò) try…except… 捕獲了異常并進(jìn)行了合理的處理,但是我們并不知道錯(cuò)誤的原因是什么。所以我們必須獲取 異常的類(lèi)型 ,首先我們來(lái)學(xué)習(xí)一下如何獲取通用異常類(lèi)型, 通用異常類(lèi)型 是我們無(wú)法確定是那種異常的情況下使用的一種捕獲方法。

用法如下:

try:
    <代碼塊>
except Exception as e:        # 把通用異常的錯(cuò)誤原因轉(zhuǎn)換成變量 e , as 為關(guān)鍵字
                            # 也可以理解為 將 Exception 通用異常類(lèi)型 起一個(gè)別名 e
                            # e 變量名可以起任意名字,一般約定成俗都會(huì)使用 e 作為異常捕獲的變量名
                            # e 就是 error 的縮寫(xiě)
    <異常代碼塊>

通用異常捕獲示例如下:

def upper(str_data):
    new_str = None

    try:
        new_str = str_data.upper()
    except Exception as e:
        print('upper() 函數(shù)轉(zhuǎn)換字符大寫(xiě)失??!', '返回結(jié)果為:{}'.format(e))
    return new_str


result = upper(1)
print(result)


# >>> 執(zhí)行結(jié)果如下:
# >>> upper() 函數(shù)轉(zhuǎn)換字符大寫(xiě)失敗! 返回結(jié)果為:'int' object has no attribute 'upper'

捕獲具體異常

捕獲具體的異常就是我們可以確定在 try 的代碼塊中會(huì)出現(xiàn)哪種具體的異常類(lèi)型,并將其捕獲的方法。語(yǔ)法方面與通用異常一樣,在異常類(lèi)型區(qū)域書(shū)寫(xiě) 具體的異常類(lèi)型 就可以了。

我們以上文的 ZeroDivisionError: division by zero 為例

try:
    1 / 0
except ZeroDivisionError as e:		# 書(shū)寫(xiě)指定的異常類(lèi)型:ZeroDivisionError
    								# ZeroDivisionError 是Python內(nèi)置的具體異常:0不能被整除
    print(e)

# >>> 執(zhí)行結(jié)果如下:
# >>> division by zero

小節(jié):思考一個(gè)問(wèn)題,工作中我們是使用 通用的異常 還是 具體的異常 呢?

從方便的角度來(lái)說(shuō),使用通用的異常會(huì)比較簡(jiǎn)單。開(kāi)發(fā)成本低,不需要關(guān)心具體的異常類(lèi)型是什么。其實(shí) Exception 也不知知道具體的異常是哪一種類(lèi)型,它需要去浩瀚的異常庫(kù)查找,找到之后進(jìn)行對(duì)應(yīng)的拋出,雖然沒(méi)有 具體指定異常 處理的那么快,但是這個(gè)處理速度也是無(wú)感知的。

如果我們能知道 try 代碼塊中 可能出現(xiàn)的具體異常類(lèi)型,還是希望使用具體的異常類(lèi)型。這樣可以精準(zhǔn)的對(duì)應(yīng)錯(cuò)誤;

==需要注意的是:當(dāng)我們的 try 代碼塊中,沒(méi)有出現(xiàn)我們指定的 具體異常 類(lèi)型,代碼執(zhí)行依然是會(huì)報(bào)錯(cuò)的。==所以各有利弊,可以根據(jù)我們工作中業(yè)務(wù)的具體情況進(jìn)行使用。

如何捕獲多個(gè)異常

在我們平時(shí)的開(kāi)發(fā)工作中,很可能在同一個(gè)代碼塊中出現(xiàn)多個(gè)異常類(lèi)型。那么我們?cè)撊绾沃С侄鄠€(gè)異常的捕獲呢?

其實(shí)異常的捕獲是非常靈活的,也支持多個(gè)異常捕獲的方式。

捕獲多個(gè)異常 - 方法1

try:
    result = 1 / 0
except ZeroDivisionError as e1:
    print(e1)
except Exception as e2:            # 可以使用多個(gè) except 來(lái)捕獲多個(gè)異常
    print('this is a public except , bug is %s' % e2)
    
# >>> 需要注意的是,當(dāng) except 代碼塊中有多個(gè)異常的時(shí)候,當(dāng)捕獲到第一個(gè)異常后,不會(huì)在繼續(xù)往下捕獲。

需要注意的是,當(dāng) except 代碼塊中有多個(gè)異常的時(shí)候,當(dāng)捕獲到第一個(gè)異常后,不會(huì)在繼續(xù)往下捕獲。

捕獲多個(gè)異常 - 方法2

try:
    result = 1 / 0
except (ZeroDivisionError, Exception) as e:        # 在 except 后面的小括號(hào)內(nèi)定義多個(gè) 異常類(lèi)型 ,(小括號(hào)其實(shí)是元組)
                                                # 當(dāng) except 后面使用元組包裹多個(gè) 異常類(lèi)型 時(shí),捕獲到哪種異常類(lèi)型就拋出哪種
    print(e)

示例如下:

def test():

    try:
        print(name)     # 因?yàn)椴淮嬖?name 這個(gè)變量,所以會(huì)拋出一個(gè) NameError: name 'name' is not defined 異常
                        # 嘗試捕獲  NameError 異常
    except (ZeroDivisionError, NameError) as e:
        print(e)
        print(type(e))


test()

# >>> 執(zhí)行結(jié)果如下:
# >>> name 'name' is not defined
# >>> <class 'NameError'>

比較常用的捕獲異常方法是第二種。

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

相關(guān)文章

  • 全面了解django的緩存機(jī)制及使用方法

    全面了解django的緩存機(jī)制及使用方法

    這篇文章主要介紹了全面了解django的緩存機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python淺析迭代器Iterator的使用

    Python淺析迭代器Iterator的使用

    這篇文章主要介紹了Python?迭代器Iterator詳情,迭代器可以幫助我們解決面對(duì)復(fù)雜的數(shù)據(jù)場(chǎng)景時(shí),快速簡(jiǎn)便的獲取數(shù)據(jù),下文關(guān)于其詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-07-07
  • Python3中類(lèi)、模塊、錯(cuò)誤與異常、文件的簡(jiǎn)易教程

    Python3中類(lèi)、模塊、錯(cuò)誤與異常、文件的簡(jiǎn)易教程

    這篇文章主要給大家介紹了關(guān)于Python3中類(lèi)、模塊、錯(cuò)誤與異常、文件的相關(guān)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Python的Flask框架中的Jinja2模板引擎學(xué)習(xí)教程

    Python的Flask框架中的Jinja2模板引擎學(xué)習(xí)教程

    這篇文章主要介紹了Python的Flask框架中的Jinja2模板引擎學(xué)習(xí)教程,Jinja2模板引擎的用法也是Flask的Web開(kāi)發(fā)中的重要知識(shí),需要的朋友可以參考下
    2016-06-06
  • 基于Python共軛梯度法與最速下降法之間的對(duì)比

    基于Python共軛梯度法與最速下降法之間的對(duì)比

    這篇文章主要介紹了基于Python共軛梯度法與最速下降法之間的對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Python中的if判斷語(yǔ)句中包含or問(wèn)題

    Python中的if判斷語(yǔ)句中包含or問(wèn)題

    這篇文章主要介紹了Python中的if判斷語(yǔ)句中包含or問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python 如何讀取字典的所有鍵-值對(duì)

    Python 如何讀取字典的所有鍵-值對(duì)

    這篇文章主要介紹了Python 讀取字典的所有鍵-值對(duì)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python3將jpg轉(zhuǎn)為pdf文件的方法示例

    Python3將jpg轉(zhuǎn)為pdf文件的方法示例

    這篇文章主要介紹了Python3將jpg轉(zhuǎn)為pdf文件的方法,結(jié)合完整實(shí)例形式分析了Python3針對(duì)jpg轉(zhuǎn)pdf格式的文件讀寫(xiě)、編碼裝換等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Python爬蟲(chóng)之App爬蟲(chóng)視頻下載的實(shí)現(xiàn)

    Python爬蟲(chóng)之App爬蟲(chóng)視頻下載的實(shí)現(xiàn)

    這篇文章主要介紹了Python爬蟲(chóng)之App爬蟲(chóng)視頻下載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python學(xué)習(xí)之a(chǎn)syncore模塊用法實(shí)例教程

    Python學(xué)習(xí)之a(chǎn)syncore模塊用法實(shí)例教程

    這篇文章主要介紹了Python學(xué)習(xí)之a(chǎn)syncore模塊用法,主要講述了asyncore模塊的組成、原理及相關(guān)函數(shù)的用法,對(duì)于使用Python進(jìn)行網(wǎng)絡(luò)編程來(lái)說(shuō)非常實(shí)用,需要的朋友可以參考下
    2014-09-09

最新評(píng)論