python面向?qū)ο笾惓?七)

  1. 什么是異常
    異常:不正常的情況

不正常的情況踢故,在程序中文黎,會有兩種體現(xiàn)
? 自己造孽:寫錯代碼了惹苗!錯誤也是一種異常;程序都運行不起來耸峭!
? 程序運行過程中桩蓉,在某些特定條件下,不合適的數(shù)據(jù)引起程序出現(xiàn)錯誤導(dǎo)致程序崩潰
? 要求用戶輸入一個數(shù)字劳闹,但是用戶誤操作輸入了字符串院究,在進行類型轉(zhuǎn)換時就會出現(xiàn)錯誤導(dǎo)致程序崩潰!

為什么要處理異常:
當(dāng)程序在運行過程中本涕,由于用戶的誤操作或者不合適的數(shù)據(jù)引發(fā)的程序錯誤业汰,讓代碼自己處理并保證程序的正常執(zhí)行。而不至于因為錯誤導(dǎo)致程序崩潰菩颖!
提高代碼的健壯性样漆!

怎么處理異常:
? 捕獲處理異常
? 斷言處理異常【測試異常信息】[擴展]

捕獲處理異常語法:
try: # 嘗試晦闰,通常情況氛濒,將可能出現(xiàn)異常的代碼,包含在try中
<可能會出現(xiàn)異常的代碼>
except [異常信息]: # 一旦出現(xiàn)異常鹅髓,代碼就會直接從出現(xiàn)異常的地方跳轉(zhuǎn)到except中執(zhí)行
<出現(xiàn)異常之后要執(zhí)行的代碼>
else: # 如果try中的代碼執(zhí)行沒有異常舞竿,執(zhí)行完畢后,就會執(zhí)行else中的代碼
<正常執(zhí)行try之后窿冯,else中的代碼執(zhí)行>
finally: # 不論是否出現(xiàn)異常骗奖,都要在try執(zhí)行完成之后執(zhí)行的代碼
<最終的掃尾工作>

案例操作:
要處理異常:
<適合新手和老鳥>
首先要明確哪些代碼可能會出現(xiàn)異常,其次定位異承汛可能出現(xiàn)的代碼的位置执桌,然后將可能出現(xiàn)異常的代碼進行異常處理。
<適合老鳥:經(jīng)驗>
在寫代碼的同時芜赌,直接處理異常

  1. 基本異常處理
    try-except直接處理異逞稣酰【可以處理任何異常—不能定位具體是什么異巢颍】
    try-except [異常信息] 【可以處理指定的異潮旌】

  2. 常見的異常
    所有異常的超類:BaseException
    標(biāo)準(zhǔn)異常的超類:Exception(BaseException)
    程序執(zhí)行過程中經(jīng)常看到的異常:
    ……

  3. 處理多個異常
    try-except (E1, E2, E3, …,En) as e 一個except處理指定的多個異常
    try-except E1-except E2-except E3… 每個except處理指定的異常

通常情況下洲愤,我們要查看異常信息颓芭,就需要打印異常信息—打印e變量的值
問題:
1) 系統(tǒng)提供的異常信息,晦澀難懂柬赐!
2) 系統(tǒng)提供的異常信息亡问,畢竟有限!

  1. 自定義異常
    異掣厮危— 一種對象
    自定義異常 – 一種自定義類型
    自定義類型[異常] – 參考標(biāo)準(zhǔn)異常(繼承Exception)—自定義異常(繼承Exception)

  2. 主動拋出異常
    在開發(fā)的過程中州藕,主動出現(xiàn)一種錯誤束世,將錯誤拋出給程序告訴程序出錯了。
    通過raise關(guān)鍵字床玻,拋出一個異常

  3. 自定義異常毁涉,就是為了專門拋出錯誤的,拋出錯誤笨枯,就是嚴(yán)重警告這里出現(xiàn)了什么問題

首先-代碼執(zhí)行過程中薪丁,出現(xiàn)了異秤鑫鳎【系統(tǒng)標(biāo)準(zhǔn)異诚诰】【信息不是很明白】
捕獲系統(tǒng)異常,創(chuàng)建一個自定義異常
拋出自定義異沉惶矗【自定義異持薷遥】【信息明確的錯誤】

自定義異常的目的:轉(zhuǎn)換異常信息,將不明確的異常信息轉(zhuǎn)換成更加精確的異常信息

print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
print("\t\t計算器系統(tǒng)")
print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
num_str = input("請輸入要計算的數(shù)值:")
try:
    num_int = int(num_str) #ValueError
except ValueError as e:# 不指定要處理的具體異常茄蚯,意味這可以處理所有可能出現(xiàn)的異常压彭!
    print("不好意思,您輸入了非法數(shù)據(jù)渗常,%s" % e)
else:
    print("用戶輸入了第一個數(shù)據(jù):%d" % num_int)

轉(zhuǎn)換異常信息:異常的傳遞~傳遞更加明確的異常壮不,給后面的代碼進行處理!
多個異常的代碼的例子:

print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
print("\t\t1.文件操作——讀取數(shù)據(jù)")
print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")

# try:
#     c = int(input("請輸入您的選項:"))  #ValueError
#     if c == 1:
#         f = open("d:/test.txt") # FileNotFoundError
#         print(f.read())
#         f.close()
# except (ValueError, FileNotFoundError) as e:
#     print("程序中出現(xiàn)了錯誤:%s" % e)

# 使用多個except
# 如果是同一個級別的異常皱碘,根據(jù)try中出現(xiàn)異常的順序進行捕獲
# 如果不是同一個級別的異常询一,先捕獲具體的【子類異常】癌椿,再捕獲抽象的【父類異辰∪铮】
try:
    c = int(input("請輸入您的選項:"))  #ValueError
    if c == 1:
        f = open("d:/test.txt") # FileNotFoundError
        print(f.read())
        f.close()
except ValueError as e:
    print("選項輸入錯誤:%s" % e)
except FileNotFoundError as e:
    print("文件讀取錯誤:%s" % e)
except Exception as e:
    print("程序中出現(xiàn)了未知錯誤:%s" % e)


print("程序執(zhí)行完成..")

自定義異常

# V1.0 定義一個自定義異常,和拋出異常的語法
# 定義一個自定義異常
# class MyError(Exception):
#     # 將錯誤描述信息踢俄,在初始化函數(shù)中缩功,交給父類
#     def __init__(self, msg):
#         Exception.__init__(self, msg)
#
# x = input("請輸入您的信息:")
# raise MyError("不好意思,我就是要出錯....")
# print("您輸入了:%s" % x)


class NumError(Exception):
    def __init__(self):
        Exception.__init__(self, "這里必須要輸入數(shù)字都办,但是您輸入了非法字符")
'''
# V2.0
try:
    num = int(input("請輸入一個數(shù)值:"))
except ValueError: # 捕獲系統(tǒng)異常
    raise NumError()
else:
    print("用戶輸入了:%d" % num)

print("程序執(zhí)行完成")
'''

# 3.0
# 定義了一個輸入數(shù)值的函數(shù):開發(fā)人員A開發(fā)的代碼
def inputNumber():
    try:
        num = int(input("請輸入一個數(shù)值:"))
    except ValueError:  # 捕獲系統(tǒng)異常
        raise NumError()
    else:
        print("用戶輸入了:%d" % num)
    return num

# 開發(fā)人員B在開發(fā)的代碼
# 調(diào)用輸入數(shù)值的方法
try:
    num = inputNumber()
except NumError as e:
    print("出現(xiàn)了異常信息:%s" % e)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫡锌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琳钉,更是在濱河造成了極大的恐慌世舰,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽卫,死亡現(xiàn)場離奇詭異跟压,居然都是意外死亡,警方通過查閱死者的電腦和手機歼培,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門震蒋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸塞,“玉大人,你說我怎么就攤上這事查剖〖嘏埃” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵笋庄,是天一觀的道長效扫。 經(jīng)常有香客問我,道長直砂,這世上最難降的妖魔是什么菌仁? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮静暂,結(jié)果婚禮上济丘,老公的妹妹穿的比我還像新娘。我一直安慰自己洽蛀,他們只是感情好摹迷,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郊供,像睡著了一般峡碉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驮审,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天鲫寄,我揣著相機與錄音,去河邊找鬼头岔。 笑死塔拳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的峡竣。 我是一名探鬼主播靠抑,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼适掰!你這毒婦竟也來了颂碧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤类浪,失蹤者是張志新(化名)和其女友劉穎载城,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體费就,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡诉瓦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睬澡。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡固额,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煞聪,到底是詐尸還是另有隱情斗躏,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布昔脯,位于F島的核電站啄糙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏云稚。R本人自食惡果不足惜隧饼,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碱鳞。 院中可真熱鬧桑李,春花似錦踱蛀、人聲如沸窿给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崩泡。三九已至,卻和暖如春猬膨,著一層夾襖步出監(jiān)牢的瞬間角撞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工勃痴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谒所,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓沛申,卻偏偏與公主長得像劣领,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铁材,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 定義類并創(chuàng)建實例 在Python中尖淘,類通過 class 關(guān)鍵字定義。以 Person 為例著觉,定義一個Person類...
    績重KF閱讀 3,954評論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理村生,服務(wù)發(fā)現(xiàn),斷路器饼丘,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評論 25 707
  • Python異常處理 異常概念: 異常:就是不正常的情況趁桃,程序開發(fā)過程中錯誤和BUG都是補充正常的情況 異常發(fā)生的...
    youngkun閱讀 924評論 0 4
  • 當(dāng)你回顧過去卫病,想到『我花錢很沒有智慧屡穗;我應(yīng)該買下那筆土地的,這樣現(xiàn)在我就會很有錢忽肛;早知道就不該投資村砂,害我損失慘重;...
    歐林光愛視界閱讀 173評論 0 0