python異常處理

程序運(yùn)行的時候會因?yàn)槟撤N原因定枷,發(fā)生錯誤孤澎,導(dǎo)致程序不能運(yùn)行。發(fā)生錯誤時依鸥,Python你會創(chuàng)建一個異常對象亥至。我們需要在編寫代碼的時候,對異常的情況做處理。否則程序?qū)⑼V菇惆纾⒊霎a(chǎn)生一個回溯絮供,拋出錯誤信息。python內(nèi)置了一套異常處理機(jī)制茶敏。

1. 錯誤

錯誤一般分為語法錯誤和語義錯誤壤靶。

1.1 語法錯誤

語法錯誤(syntax errors)即代碼編寫不符合該語言的語法。一般由內(nèi)置的語法分析器檢測惊搏,并拋出異常贮乳。如下:缺少冒號時:

>>> for x in range(10)
...     print(x)
...     
  File "<input>", line 1
    for x in range(10)
                     ^
SyntaxError: invalid syntax
1.2 語義錯誤

語義錯誤(又稱邏輯錯誤),一般是由于某種原因代碼輸出的結(jié)果不符合預(yù)期結(jié)果恬惯。此時就可能發(fā)生語義錯誤向拆。語義錯誤不能被立刻發(fā)現(xiàn)。如下:

>>> def average(x, y):
...     return x + y / 2
... 

該函數(shù)本意為求兩個數(shù)的平均數(shù)酪耳,由于運(yùn)算符優(yōu)先級問題浓恳,導(dǎo)致輸出結(jié)果偏離預(yù)期結(jié)果。

2. 異常

python使用異常對象來表示異常情況碗暗。程序發(fā)生錯誤時會引發(fā)一個異常颈将。若異常未被處理或捕捉,產(chǎn)生一個回溯(Traceback)言疗,拋出錯誤信息晴圾, 終止程序運(yùn)行≡胙伲回溯主要內(nèi)容解釋:

>>> 1 / 0
Traceback (most recent call last):
  File "<input>", line 1, in <module>  # 異常信息所在位置
ZeroDivisionError: division by zero  # 異常類型及引起原因

python中的異常也是類死姚,相應(yīng)的異常對象就是該類的實(shí)例。python所有的異常類的基類均為BaseException梗醇。具體信息在這里知允。常見的異常類型如下:

image
2.1 異常處理

編寫代碼時,若我們知道某段代碼可能導(dǎo)致某種異常叙谨,又不希望程序以堆棧跟蹤的形式終止温鸽,可以使用try.....except.....finally的語句對異常進(jìn)行處理。

try語句后跟想要執(zhí)行的代碼手负,如果執(zhí)行出錯涤垫,則后續(xù)代碼不會繼續(xù)執(zhí)行,而是直接跳轉(zhuǎn)至錯誤處理代碼竟终,即except語句塊蝠猬,執(zhí)行完except后,如果有finally語句塊统捶,則執(zhí)行finally語句塊榆芦,至此柄粹,執(zhí)行完畢。

基本形式

捕捉異常的基本形式是try.........except..........語句

except語句的一般形式為:execpt 異常類型 as 變量: 異常處理語句

使用except時需要注意的是匆绣,它不但捕獲該類型的錯誤驻右,還捕捉子類異常。

# try--except---
try:
    x = 10 / 0
    peinr("x:", x)
except ZeroDivisionError as e:
    print("error:%s" % e)
    
# 執(zhí)行結(jié)果
error:division by zero

捕獲多個異常

可以使用多個except語句來捕捉多個異常最多執(zhí)行一個崎淳。except子句后可跟一個元組堪夭,里面可包含多個異常類。

# 捕獲多個異常
try:
    x = int(input("Enter x:"))
    y = int(input("Enter y:"))
    print(x / y)
except ZeroDivisionError as e:
    print("error:%s" % e)
except ValueError as e:
    print("error:%s" % e)
    
# 執(zhí)行結(jié)果
Enter x:10
Enter y:0
error:division by zero

捕獲未知異常

使用BaseException(所有異常類的父類)或Exception(大部分異常類的父類)來捕捉未知異常拣凹。使用except時需要注意的是森爽,它不但捕獲該類型的錯誤外盯,還捕捉子類異常宋彼。

# 捕獲未知異常
try:
    x = 10 / 0
    peinr("x:", x)
except Exception as e:
    print("error:%s" % e)
    
# 執(zhí)行結(jié)果
error:division by zero

else子句

沒有異常發(fā)生時執(zhí)行else子句誊涯。

# else子句
try:
    x = int(input("Enter x:"))
    y = int(input("Enter y:"))
    print(x / y)
except ZeroDivisionError as e:
    print("error:%s" % e)
except ValueError as e:
    print("error:%s" % e)
else:
    print("沒有異常發(fā)生時執(zhí)行")
    
# 結(jié)果 
Enter x:10
Enter y:2
5.0
沒有異常發(fā)生時執(zhí)行

finally子句

不管有沒有異常發(fā)生最終都執(zhí)行finally子句放坏。

# finally子句
try:
    x = int(input("Enter x:"))
    y = int(input("Enter y:"))
    print(x / y)
except ZeroDivisionError as e:
    print("error:%s" % e)
except ValueError as e:
    print("error:%s" % e)
else:
    print("沒有異常發(fā)生時執(zhí)行")
finally:
    print("有無異常發(fā)生均執(zhí)行")
    
# 執(zhí)行結(jié)果 
Enter x:10 
Enter y:0 
error:division by zero 
有無異常發(fā)生均執(zhí)行 
2.2 異常的傳遞性
  • 異常的傳遞 —— 當(dāng) 函數(shù)/方法執(zhí)行出現(xiàn)異常,會將異常傳遞給函數(shù)/方法的調(diào)用一方
  • 如果傳遞到主程序辛萍,仍然沒有異常處理儒搭,程序才會被終止

提示

  • 在開發(fā)中悲柱,可以在主函數(shù)中增加異常捕獲
  • 而在主函數(shù)中調(diào)用的其他函數(shù)捧请,只要出現(xiàn)異常,都會傳遞到主函數(shù)的 異常捕獲 中
  • 這樣就不需要在代碼中棒搜,增加大量的異常捕獲疹蛉,能夠保證代碼的整潔
2.3 手動拋出異常

raise語句(即拋出一個異常的實(shí)例)。raise語句沒有參數(shù)就會將當(dāng)前異常原樣拋出力麸。我們可創(chuàng)建自定義的異常類可款,可直接或間接繼承自Exception類。

# 手動拋出異常
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)

# 執(zhí)行結(jié)果

請輸入密碼:1653565
發(fā)現(xiàn)錯誤:密碼長度不夠
# 自定義異常類
class Myerror(ValueError):
    pass

try:
    x = int(input("Enter x:"))
    y = int(input("Enter y:"))
    
    print(x / y)
    raise Myerror("自定義異常類的實(shí)例對象")
except Exception as e:
    print(e)

# 執(zhí)行結(jié)果
Enter x:10
Enter y:2
5.0
自定義異常類的實(shí)例對象

3. 斷言

表示為一些布爾表達(dá)式埃叭,多用來對程序邏輯進(jìn)行檢測摸恍。常用在以下場合:

  • 可以在預(yù)計(jì)正常情況下程序不會到達(dá)的地方放置斷言 :assert false
  • 斷言可以用于檢查傳遞給私有方法的參數(shù)
  • 使用斷言測試方法執(zhí)行的前置條件和后置條件
  • 使用斷言檢查類的不變狀態(tài),確保任何情況下赤屋,某個變量的狀態(tài)必須滿足立镶。
  • 單元測試等。
# 斷言

def add(x, y):
    assert x > 5  # 用來判斷某種狀態(tài)
    return x + y

result = add(3, 4)
print(result)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末类早,一起剝皮案震驚了整個濱河市媚媒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涩僻,老刑警劉巖缭召,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栈顷,死亡現(xiàn)場離奇詭異,居然都是意外死亡嵌巷,警方通過查閱死者的電腦和手機(jī)萄凤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴竞,“玉大人蛙卤,你說我怎么就攤上這事∝溃” “怎么了颤难?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長已维。 經(jīng)常有香客問我行嗤,道長,這世上最難降的妖魔是什么垛耳? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任栅屏,我火速辦了婚禮,結(jié)果婚禮上堂鲜,老公的妹妹穿的比我還像新娘栈雳。我一直安慰自己,他們只是感情好缔莲,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布哥纫。 她就那樣靜靜地躺著,像睡著了一般痴奏。 火紅的嫁衣襯著肌膚如雪蛀骇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天读拆,我揣著相機(jī)與錄音擅憔,去河邊找鬼。 笑死檐晕,一個胖子當(dāng)著我的面吹牛暑诸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辟灰,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼屠列,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伞矩?” 一聲冷哼從身側(cè)響起笛洛,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乃坤,沒想到半個月后苛让,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沟蔑,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年狱杰,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘦材。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡仿畸,死狀恐怖食棕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情错沽,我是刑警寧澤簿晓,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站千埃,受9級特大地震影響憔儿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜放可,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一谒臼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耀里,春花似錦蜈缤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至织堂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奶陈,已是汗流浹背易阳。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吃粒,地道東北人潦俺。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像徐勃,于是被迫代替她去往敵國和親事示。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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

  • @Author : Roger TX (425144880@qq.com) @Link : https:/...
    Roger田翔閱讀 4,337評論 0 2
  • Python異常處理 異常概念: 異常:就是不正常的情況僻肖,程序開發(fā)過程中錯誤和BUG都是補(bǔ)充正常的情況 異常發(fā)生的...
    youngkun閱讀 924評論 0 4
  • 異常處理在任何一門編程語言里都是值得關(guān)注的一個話題肖爵,良好的異常處理可以讓你的程序更加健壯,清晰的錯誤信息更能幫助你...
    妄心xyx閱讀 550評論 0 0
  • 姥爺開始帶團(tuán)團(tuán)睡覺臀脏。他晚上固定和幾個農(nóng)學(xué)院的老教授麻將休閑娛樂三小時劝堪,到家正好陪小寶睡覺冀自。我負(fù)責(zé)把小寶哐睡著...
    嚴(yán)聽的自律日記閱讀 173評論 0 0
  • 好久沒有寫文章了,這一段時間在忙著準(zhǔn)備期末考試和找實(shí)習(xí)秒啦,上周已經(jīng)在一家公司開始實(shí)習(xí)了熬粗,公司是用Vue開發(fā)項(xiàng)目,Bo...
    Billy_d972閱讀 3,653評論 0 0