(18) python中異常

異常

異常的概念

  • 程序在運(yùn)行時(shí),如果 Python 解釋器 遇到 到一個(gè)錯(cuò)誤厕吉,會(huì)停止程序的執(zhí)行械念,并且提示一些錯(cuò)誤信息,這就是 異常
  • 程序停止執(zhí)行并且提示錯(cuò)誤信息 這個(gè)動(dòng)作项钮,我們通常稱之為:拋出(raise)異常

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

異常

捕獲異常:try except else finally

簡單的捕獲異常語法

  • 在程序開發(fā)中亦歉,如果 對(duì)某些代碼的執(zhí)行不能確定是否正確畅哑,可以增加 try(嘗試)捕獲異常
try:
    嘗試執(zhí)行的代碼
except:
    出現(xiàn)錯(cuò)誤的處理

  • try 嘗試,下方編寫要嘗試代碼赛蔫,不確定是否能夠正常執(zhí)行的代碼
  • except 如果不是泥张,下方編寫嘗試失敗的代碼

簡單異常捕獲1 —— 要求用戶輸入整數(shù)

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

錯(cuò)誤類型捕獲

  • 在程序執(zhí)行時(shí)媚创,可能會(huì)遇到 不同類型的異常,并且需要 針對(duì)不同類型的異常鳄橘,做出不同的響應(yīng),這個(gè)時(shí)候瘫怜,就需要捕獲錯(cuò)誤類型了
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ò)誤類型

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

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

捕獲未知錯(cuò)誤

  • 在開發(fā)時(shí),要預(yù)判到所有可能出現(xiàn)的錯(cuò)誤嗤瞎,還是有一定難度的
  • 如果希望程序 無論出現(xiàn)任何錯(cuò)誤听系,都不會(huì)因?yàn)?Python 解釋器 拋出異常而被終止,可以再增加一個(gè) except

語法如下:

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

異常捕獲完整語法

  • 在實(shí)際開發(fā)中掉瞳,為了能夠處理復(fù)雜的異常情況陕习,完整的異常語法如下:
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:
    # 沒有異常才會(huì)執(zhí)行的代碼
    pass
finally:
    # 無論是否有異常娘纷,都會(huì)執(zhí)行的代碼
    print("無論是否有異常,都會(huì)執(zhí)行的代碼")

  • else 只有在沒有異常時(shí)才會(huì)執(zhí)行的代碼

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

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

try:
    num = int(input("請(qǐng)輸入整數(shù):"))
    result = 8 / num
    print(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í)行完成擦耀,但是不保證正確")

異常的傳遞

  • 異常的傳遞 —— 當(dāng) 函數(shù)/方法 執(zhí)行 出現(xiàn)異常,會(huì) 將異常傳遞 給 函數(shù)/方法 的 調(diào)用一方
  • 如果 傳遞到主程序分瘾,仍然 沒有異常處理吁系,程序才會(huì)被終止

提示:

  • 在開發(fā)中,可以在主函數(shù)中增加 異常捕獲上岗,而在主函數(shù)中調(diào)用的其他函數(shù)蕴坪,只要出現(xiàn)異常,都會(huì)傳遞到主函數(shù)的異常捕獲中
  • 這樣就不需要在代碼中呆瞻,增加大量的異常捕獲径玖,能夠保證代碼的整潔
'''
需求:
1\.  定義函數(shù) `demo1()` **提示用戶輸入一個(gè)整數(shù)并且返回**
2\.  定義函數(shù) `demo2()` 調(diào)用 `demo1()`
3\.  在主程序中調(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)

拋出異常: raise

應(yīng)用場景

  • 在開發(fā)中梳星,除了 代碼執(zhí)行出錯(cuò) Python 解釋器會(huì) 拋出 異常之外
  • 還可以根據(jù) 應(yīng)用程序 特有的業(yè)務(wù)需求 主動(dòng)拋出異常

示例

  • 提示用戶 輸入密碼,如果 長度少于 8薯定,拋出 異常

    [圖片上傳失敗...(image-3d2a0b-1542201966092)]

拋出異常

  • Python 中提供了一個(gè) Exception 異常類
  • 在開發(fā)時(shí)瞳购,如果滿足 特定業(yè)務(wù)需求時(shí)学赛,希望 拋出異常吞杭,由其他需要處理的函數(shù)捕獲異常,可以:
    1. 創(chuàng)建 一個(gè) Exception對(duì)象
    2. 使用 raise 關(guān)鍵字 拋出 異常對(duì)象
'''
**需求**

*   定義 `input_password` 函數(shù)绢掰,提示用戶輸入密碼
*   如果用戶輸入長度 < 8,拋出異常
*   如果用戶輸入長度 >=8攻晒,返回輸入的密碼
'''
def input_password():

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

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

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

    # 2> 拋出異常對(duì)象
    raise ex

try:
    user_pwd = input_password()
    print(user_pwd)
except Exception as result:
    print("發(fā)現(xiàn)錯(cuò)誤:%s" % result)

參考文章:
http://www.reibang.com/p/ebc19de7a204

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末动羽,一起剝皮案震驚了整個(gè)濱河市盟榴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羽德,老刑警劉巖迅办,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站欺,死亡現(xiàn)場離奇詭異,居然都是意外死亡矾策,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門逃糟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绰咽,“玉大人地粪,你說我怎么就攤上這事◇〖迹” “怎么了斗忌?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵飞蹂,是天一觀的道長陈哑。 經(jīng)常有香客問我伸眶,道長,這世上最難降的妖魔是什么厘贼? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任嘴秸,我火速辦了婚禮,結(jié)果婚禮上凭疮,老公的妹妹穿的比我還像新娘串述。我一直安慰自己,他們只是感情好纲酗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布觅赊。 她就那樣靜靜地躺著,像睡著了一般饶囚。 火紅的嫁衣襯著肌膚如雪规脸。 梳的紋絲不亂的頭發(fā)上熊咽,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音被因,去河邊找鬼。 笑死梨与,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥鞋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼壕曼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼腮郊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轧飞,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤过咬,失蹤者是張志新(化名)和其女友劉穎制妄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍捡,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砸脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年凌埂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳抓。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孩哑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出横蜒,到底是詐尸還是另有隱情销凑,我是刑警寧澤仅炊,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布抚垄,位于F島的核電站,受9級(jí)特大地震影響呆馁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜次询,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一屯吊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒卸,春花似錦次氨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坐儿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間貌矿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工黑低, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尽楔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓玛荞,卻偏偏與公主長得像呕寝,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子下梢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355