Python異常處理

本節(jié)課綱:

  • 異常的概念
  • 捕獲異常
  • 異常的傳遞
  • 拋出raise異常
  • 自定義異常
一、異常的概念
  • 程序在運行時,如果 Python 解釋器 遇到 到一個錯誤宰缤,會停止程序的執(zhí)行,并且提示一些錯誤信息晃洒,這就是 異常
  • 程序停止執(zhí)行并且提示錯誤信息 這個動作慨灭,我們通常稱之為:拋出(raise)異常

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

一段代碼:

num = int(input("請輸入數(shù)字:"))
print('hello')

如果我們輸入非數(shù)字,輸出:

請輸入數(shù)字:s
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/untitled16/ex.py", line 6, in <module>
    num = int(input("請輸入數(shù)字:"))
ValueError: invalid literal for int() with base 10: 's'

1.發(fā)生錯誤 2.程序終止---hello沒有輸出

二、捕獲異常

2.1 簡單的捕獲異常語法

  • 在程序開發(fā)中吃引,如果 對某些代碼的執(zhí)行不能確定是否正確筹陵,可以增加 try(嘗試) 來 捕獲異常
  • 捕獲異常最簡單的語法格式:
try:
    嘗試執(zhí)行的代碼
except:
    出現(xiàn)錯誤的處理
  • try 嘗試,下方編寫要嘗試代碼镊尺,不確定是否能夠正常執(zhí)行的代碼
  • except 如果不是朦佩,下方編寫嘗試失敗的代碼
    簡單異常捕獲演練 —— 要求用戶輸入整數(shù)
try:
    # 提示用戶輸入一個數(shù)字
    num = int(input("請輸入數(shù)字:"))
except:
    print("請輸入正確的數(shù)字")

print('hello')

輸入非數(shù)字:

請輸入數(shù)字:r
請輸入正確的數(shù)字
hello

程序沒有終止,輸出了hello
2.2 錯誤類型捕獲

  • 在程序執(zhí)行時鹅心,可能會遇到 不同類型的異常吕粗,并且需要 針對不同類型的異常,做出不同的響應旭愧,這個時候颅筋,就需要捕獲錯誤類型了

  • 語法如下:

try:
    # 嘗試執(zhí)行的代碼
    pass
except 錯誤類型1:
    # 針對錯誤類型1,對應的代碼處理
    pass
except (錯誤類型2, 錯誤類型3):
    # 針對錯誤類型2 和 3输枯,對應的代碼處理
    pass
except Exception as result:
    print("未知錯誤 %s" % result)
  • 當 Python 解釋器 拋出異常 時议泵,最后一行錯誤信息的第一個單詞,就是錯誤類型
    異常類型捕獲演練 —— 要求用戶輸入整數(shù)
    需求
    1)提示用戶輸入一個整數(shù)
    2)使用 8 除以用戶輸入的整數(shù)并且輸出
try:
    num = int(input("請輸入整數(shù):"))
    result = 8 / num
    print(result)
except ValueError:
    print("請輸入正確的整數(shù)")
except ZeroDivisionError:
    print("除 0 錯誤")

捕獲未知錯誤

  • 在開發(fā)時桃熄,要預判到所有可能出現(xiàn)的錯誤先口,還是有一定難度的
  • 如果希望程序 無論出現(xiàn)任何錯誤,都不會因為 Python 解釋器 拋出異常而被終止瞳收,可以再增加一個 except

語法如下:

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

2.3 異常捕獲完整語

  • 在實際開發(fā)中碉京,為了能夠處理復雜的異常情況,完整的異常語法如下:

提示:
1)有關完整語法的應用場景螟深,在后續(xù)學習中谐宙,結合實際的案例會更好理解
2)現(xiàn)在先對這個語法結構有個印象即可

try:
    # 嘗試執(zhí)行的代碼
    pass
except 錯誤類型1:
    # 針對錯誤類型1,對應的代碼處理
    pass
except 錯誤類型2:
    # 針對錯誤類型2界弧,對應的代碼處理
    pass
except (錯誤類型3, 錯誤類型4):
    # 針對錯誤類型3 和 4凡蜻,對應的代碼處理
    pass
except Exception as result:
    # 打印錯誤信息
    print(result)
else:
    # 沒有異常才會執(zhí)行的代碼
    pass
finally:
    # 無論是否有異常搭综,都會執(zhí)行的代碼
    print("無論是否有異常,都會執(zhí)行的代碼")
  • else 只有在沒有異常時才會執(zhí)行的代碼

  • finally 無論是否有異常划栓,都會執(zhí)行的代碼

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

try:
    num = int(input("請輸入整數(shù):"))
    result = 8 / num
    print(result)
except ValueError:
    print("請輸入正確的整數(shù)")
except ZeroDivisionError:
    print("除 0 錯誤")
except Exception as result:
    print("未知錯誤 %s" % result)
else:
    print("正常執(zhí)行")
finally:
    print("執(zhí)行完成兑巾,但是不保證正確")
三、異常的傳遞
  • 異常的傳遞 —— 當 函數(shù)/方法 執(zhí)行 出現(xiàn)異常忠荞,會 將異常傳遞 給 函數(shù)/方法 的 調用一方
  • 如果 傳遞到主程序蒋歌,仍然 沒有異常處理,程序才會被終止

提示

  • 在開發(fā)中钻洒,可以在主函數(shù)中增加 異常捕獲
  • 而在主函數(shù)中調用的其他函數(shù)奋姿,只要出現(xiàn)異常,都會傳遞到主函數(shù)的 異常捕獲 中
  • 這樣就不需要在代碼中素标,增加大量的 異常捕獲称诗,能夠保證代碼的整潔

需求

1.定義函數(shù) demo1() 提示用戶輸入一個整數(shù)并且返回
2.定義函數(shù) demo2() 調用 demo1()
3.在主程序中調用 demo2()

def demo1():
    return int(input("請輸入一個整數(shù):"))

def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print("請輸入正確的整數(shù)")
except Exception as result:
    print("未知錯誤 %s" % result)
四、拋出raise異常

4.1 應用場景

  • 在開發(fā)中头遭,除了 代碼執(zhí)行出錯 Python 解釋器會 拋出 異常之外
  • 還可以根據 應用程序 特有的業(yè)務需求 主動拋出異常

示例

  • 提示用戶 輸入密碼寓免,如果 長度少于 8,拋出 異常
    注意
  • 當前函數(shù) 只負責 提示用戶輸入密碼计维,如果 密碼長度不正確袜香,需要其他的函數(shù)進行額外處理
  • 因此可以 拋出異常,由其他需要處理的函數(shù) 捕獲異常

4.2 拋出異常

  • Python 中提供了一個 Exception 異常類
  • 在開發(fā)時鲫惶,如果滿足 特定業(yè)務需求時蜈首,希望 拋出異常,可以:
    1.創(chuàng)建 一個 Exception 的 對象
    2.使用 raise 關鍵字 拋出 異常對象

需求

  • 定義 input_password 函數(shù)欠母,提示用戶輸入密碼
  • 如果用戶輸入長度 < 8欢策,拋出異常
  • 如果用戶輸入長度 >=8,返回輸入的密碼
def input_password():

    # 1\. 提示用戶輸入密碼
    pwd = input("請輸入密碼:")

    # 2\. 判斷密碼長度赏淌,如果長度 >= 8踩寇,返回用戶輸入的密碼
    if len(pwd) >= 8:
        return pwd

    # 3\. 密碼長度不夠,需要拋出異常
    # 1> 創(chuàng)建異常對象 - 使用異常的錯誤信息字符串作為參數(shù)
    ex = Exception("密碼長度不夠")

    # 2> 拋出異常對象
    raise ex

try:
    user_pwd = input_password()
    print(user_pwd)
except Exception as result:
    print("發(fā)現(xiàn)錯誤:%s" % result)
五六水、自定義異常

自定義異常主要是自己定義的異常類俺孙,對異常進行分門別類管理,自定義異常需要繼承異常父類Exception 一個例子

class MyException(Exception):                   #讓MyException類繼承Exception
    def __init__(self,name,age):
        self.name = name
        self.age = age
try:
    #知識點:主動拋出異常掷贾,就是實例化一個異常類
    raise MyException("zhansgan",19)            #實例化一個異常,實例化的時候需要傳參數(shù)
except MyException as obj:                      #這里體現(xiàn)一個封裝睛榄,
    print(obj.age,obj.name)                     #捕獲的就是MyException類攜帶過來的信息

except Exception as obj:                        #萬能捕獲,之前的可能捕獲不到想帅,這里添加Exception作為保底
    print(obj)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末懈费,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子博脑,更是在濱河造成了極大的恐慌憎乙,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叉趣,死亡現(xiàn)場離奇詭異泞边,居然都是意外死亡,警方通過查閱死者的電腦和手機疗杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門阵谚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烟具,你說我怎么就攤上這事梢什。” “怎么了朝聋?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵嗡午,是天一觀的道長。 經常有香客問我冀痕,道長荔睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任言蛇,我火速辦了婚禮僻他,結果婚禮上,老公的妹妹穿的比我還像新娘腊尚。我一直安慰自己吨拗,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布婿斥。 她就那樣靜靜地躺著劝篷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪受扳。 梳的紋絲不亂的頭發(fā)上携龟,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音勘高,去河邊找鬼峡蟋。 笑死,一個胖子當著我的面吹牛华望,可吹牛的內容都是我干的蕊蝗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赖舟,長吁一口氣:“原來是場噩夢啊……” “哼蓬戚!你這毒婦竟也來了?” 一聲冷哼從身側響起宾抓,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤子漩,失蹤者是張志新(化名)和其女友劉穎豫喧,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幢泼,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡紧显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缕棵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵班。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖招驴,靈堂內的尸體忽然破棺而出篙程,到底是詐尸還是另有隱情,我是刑警寧澤别厘,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布虱饿,位于F島的核電站,受9級特大地震影響丹允,放射性物質發(fā)生泄漏郭厌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一雕蔽、第九天 我趴在偏房一處隱蔽的房頂上張望折柠。 院中可真熱鬧,春花似錦批狐、人聲如沸扇售。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽承冰。三九已至,卻和暖如春食零,著一層夾襖步出監(jiān)牢的瞬間困乒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工贰谣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娜搂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓吱抚,卻偏偏與公主長得像百宇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秘豹,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • Python異常處理 異常概念: 異常:就是不正常的情況携御,程序開發(fā)過程中錯誤和BUG都是補充正常的情況 異常發(fā)生的...
    youngkun閱讀 921評論 0 4
  • 異常處理 異常Exception 錯誤 Error :錯誤是可以避免的邏輯錯誤:算法寫錯了啄刹,加法寫成了減法筆誤:變...
    vampire6閱讀 1,072評論 0 0
  • 做iOS開發(fā)的人都知道涮坐,使用cocoapods來管理三方庫十分的方便,而且目前有一個很火的概念鸵膏,就是使用cocoa...
    瞬csr閱讀 512評論 0 1
  • 前言 實踐 前言MVP(Model View Presenter)模式是MVC模式的一個演化版本膊升,目前在Andro...
    優(yōu)疏閱讀 1,107評論 1 3
  • 我是tp5.1下,用composer安裝擴展包谭企,在命令行運行,無任何不反應评肆,不下載也不報錯债查,這時,我們先ctrl+...
    IT小池閱讀 17,308評論 1 1