日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python中的异常处理详解

發(fā)布時(shí)間:2025/3/20 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的异常处理详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 異常的概念

  • 程序在運(yùn)行時(shí),如果 Python 解釋器 遇到 到一個(gè)錯(cuò)誤,會(huì)停止程序的執(zhí)行,并且提示一些錯(cuò)誤信息,這就是 異常

  • 程序停止執(zhí)行并且提示錯(cuò)誤信息 這個(gè)動(dòng)作,我們通常稱之為:拋出(raise)異常

?

程序開(kāi)發(fā)時(shí),很難將 所有的特殊情況 都處理的面面俱到,通過(guò) 異常捕獲 可以針對(duì)突發(fā)事件做集中的處理,從而保證程序的 穩(wěn)定性和健壯性

2. 捕獲異常

2.1 簡(jiǎn)單的捕獲異常語(yǔ)法

  • 在程序開(kāi)發(fā)中,如果 對(duì)某些代碼的執(zhí)行不能確定是否正確,可以增加 try(嘗試) 來(lái) 捕獲異常

  • 捕獲異常最簡(jiǎn)單的語(yǔ)法格式:

try:嘗試執(zhí)行的代碼 except:出現(xiàn)錯(cuò)誤的處理
  • try 嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執(zhí)行的代碼

  • except 如果不是,下方編寫嘗試失敗的代碼

簡(jiǎn)單異常捕獲演練 —— 要求用戶輸入整數(shù)

try:# 提示用戶輸入一個(gè)數(shù)字num = int(input("請(qǐng)輸入數(shù)字:")) except:print("請(qǐng)輸入正確的數(shù)字")

2.2 錯(cuò)誤類型捕獲

  • 在程序執(zhí)行時(shí),可能會(huì)遇到 不同類型的異常,并且需要 針對(duì)不同類型的異常,做出不同的響應(yīng),這個(gè)時(shí)候,就需要捕獲錯(cuò)誤類型了

  • 語(yǔ)法如下:

try:# 嘗試執(zhí)行的代碼pass except 錯(cuò)誤類型1:# 針對(duì)錯(cuò)誤類型1,對(duì)應(yīng)的代碼處理pass except (錯(cuò)誤類型2, 錯(cuò)誤類型3):# 針對(duì)錯(cuò)誤類型2 和 3,對(duì)應(yīng)的代碼處理pass except Exception as result:print("未知錯(cuò)誤 %s" % result)
  • 當(dāng) Python 解釋器 拋出異常 時(shí),最后一行錯(cuò)誤信息的第一個(gè)單詞,就是錯(cuò)誤類型

異常類型捕獲演練 —— 要求用戶輸入整數(shù)

需求

  • 提示用戶輸入一個(gè)整數(shù)

  • 使用 8 除以用戶輸入的整數(shù)并且輸出

  • try:num = int(input("請(qǐng)輸入整數(shù):"))result = 8 / numprint(result) except ValueError:print("請(qǐng)輸入正確的整數(shù)") except ZeroDivisionError:print("除 0 錯(cuò)誤")

    捕獲未知錯(cuò)誤

    • 在開(kāi)發(fā)時(shí),要預(yù)判到所有可能出現(xiàn)的錯(cuò)誤,還是有一定難度的

    • 如果希望程序 無(wú)論出現(xiàn)任何錯(cuò)誤,都不會(huì)因?yàn)?Python 解釋器 拋出異常而被終止,可以再增加一個(gè) except

    語(yǔ)法如下:

    except Exception as result:print("未知錯(cuò)誤 %s" % result)

    2.3 異常捕獲完整語(yǔ)法

    • 在實(shí)際開(kāi)發(fā)中,為了能夠處理復(fù)雜的異常情況,完整的異常語(yǔ)法如下:

    提示:

    • 有關(guān)完整語(yǔ)法的應(yīng)用場(chǎng)景,在后續(xù)學(xué)習(xí)中,結(jié)合實(shí)際的案例會(huì)更好理解

    • 現(xiàn)在先對(duì)這個(gè)語(yǔ)法結(jié)構(gòu)有個(gè)印象即可

    try:# 嘗試執(zhí)行的代碼pass except 錯(cuò)誤類型1:# 針對(duì)錯(cuò)誤類型1,對(duì)應(yīng)的代碼處理pass except 錯(cuò)誤類型2:# 針對(duì)錯(cuò)誤類型2,對(duì)應(yīng)的代碼處理pass except (錯(cuò)誤類型3, 錯(cuò)誤類型4):# 針對(duì)錯(cuò)誤類型3 和 4,對(duì)應(yīng)的代碼處理pass except Exception as result:# 打印錯(cuò)誤信息print(result) else:# 沒(méi)有異常才會(huì)執(zhí)行的代碼pass finally:# 無(wú)論是否有異常,都會(huì)執(zhí)行的代碼print("無(wú)論是否有異常,都會(huì)執(zhí)行的代碼")
    • else 只有在沒(méi)有異常時(shí)才會(huì)執(zhí)行的代碼

    • finally 無(wú)論是否有異常,都會(huì)執(zhí)行的代碼

    • 之前一個(gè)演練的 完整捕獲異常 的代碼如下:

    try:num = int(input("請(qǐng)輸入整數(shù):"))result = 8 / numprint(result) except ValueError:print("請(qǐng)輸入正確的整數(shù)") except ZeroDivisionError:print("除 0 錯(cuò)誤") except Exception as result:print("未知錯(cuò)誤 %s" % result) else:print("正常執(zhí)行") finally:print("執(zhí)行完成,但是不保證正確")

    3. 異常的傳遞

    • 異常的傳遞 —— 當(dāng) 函數(shù)/方法 執(zhí)行 出現(xiàn)異常,會(huì) 將異常傳遞 給 函數(shù)/方法 的 調(diào)用一方

    • 如果 傳遞到主程序,仍然 沒(méi)有異常處理,程序才會(huì)被終止

    提示

    • 在開(kāi)發(fā)中,可以在主函數(shù)中增加 異常捕獲

    • 而在主函數(shù)中調(diào)用的其他函數(shù),只要出現(xiàn)異常,都會(huì)傳遞到主函數(shù)的 異常捕獲

    • 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔

    需求

  • 定義函數(shù) demo1() 提示用戶輸入一個(gè)整數(shù)并且返回

  • 定義函數(shù) demo2() 調(diào)用 demo1()

  • 在主程序中調(diào)用 demo2()

  • def demo1():return int(input("請(qǐng)輸入一個(gè)整數(shù):")) ? ? def demo2():return demo1() ? try:print(demo2()) except ValueError:print("請(qǐng)輸入正確的整數(shù)") except Exception as result:print("未知錯(cuò)誤 %s" % result)

    4. 拋出 raise 異常

    4.1 應(yīng)用場(chǎng)景

    • 在開(kāi)發(fā)中,除了 代碼執(zhí)行出錯(cuò) Python 解釋器會(huì) 拋出 異常之外

      • 還可以根據(jù) 應(yīng)用程序 特有的業(yè)務(wù)需求 主動(dòng)拋出異常

      示例

    • 提示用戶 輸入密碼,如果 長(zhǎng)度少于 8,拋出 異常

    ?

    注意

    • 當(dāng)前函數(shù) 只負(fù)責(zé) 提示用戶輸入密碼,如果 密碼長(zhǎng)度不正確,需要其他的函數(shù)進(jìn)行額外處理

    • 因此可以 拋出異常,由其他需要處理的函數(shù) 捕獲異常

    4.2 拋出異常

    • Python 中提供了一個(gè) Exception 異常類

    • 在開(kāi)發(fā)時(shí),如果滿足特定業(yè)務(wù)需求時(shí),希望拋出異常,可以:

    • 創(chuàng)建 一個(gè) Exception 的 對(duì)象

    • 使用 raise 關(guān)鍵字 拋出 異常對(duì)象

    需求

    • 定義 input_password 函數(shù),提示用戶輸入密碼

    • 如果用戶輸入長(zhǎng)度 < 8,拋出異常

    • 如果用戶輸入長(zhǎng)度 >=8,返回輸入的密碼

    def input_password(): ?# 1. 提示用戶輸入密碼pwd = input("請(qǐng)輸入密碼:") ?# 2. 判斷密碼長(zhǎng)度,如果長(zhǎng)度 >= 8,返回用戶輸入的密碼if len(pwd) >= 8:return pwd ?# 3. 密碼長(zhǎng)度不夠,需要拋出異常# 1> 創(chuàng)建異常對(duì)象 - 使用異常的錯(cuò)誤信息字符串作為參數(shù)ex = Exception("密碼長(zhǎng)度不夠") ?# 2> 拋出異常對(duì)象raise ex ? ? try:user_pwd = input_password()print(user_pwd) except Exception as result:print("發(fā)現(xiàn)錯(cuò)誤:%s" % result)

    5.記錄錯(cuò)誤

    如果不捕獲錯(cuò)誤,自然可以讓Python解釋器來(lái)打印出錯(cuò)誤堆棧,但程序也被結(jié)束了。既然我們能捕獲錯(cuò)誤,就可以把錯(cuò)誤堆棧打印出來(lái),然后分析錯(cuò)誤原因,同時(shí),讓程序繼續(xù)執(zhí)行下去。

    Python內(nèi)置的logging模塊可以非常容易地記錄錯(cuò)誤信息:

    import logging ? ? def foo(s):return 10 / int(s) ? ? def bar(s):return foo(s) * 2 ? ? def main():try:bar('0')except Exception as e:logging.exception(e) ? ? main() print('END')

    同樣是出錯(cuò),但程序打印完錯(cuò)誤信息后會(huì)繼續(xù)執(zhí)行,并正常退出:

    $ python3 err_logging.py ERROR:root:division by zero Traceback (most recent call last):File "err_logging.py", line 13, in mainbar('0')File "err_logging.py", line 9, in barreturn foo(s) * 2File "err_logging.py", line 6, in fooreturn 10 / int(s) ZeroDivisionError: division by zero END

    通過(guò)配置,logging還可以把錯(cuò)誤記錄到日志文件里,方便事后排查。

    總結(jié)

    以上是生活随笔為你收集整理的Python中的异常处理详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。