異常

1異常

1.1異常簡介

異常就是程序運行錯誤或者邏輯混亂科侈。不能讓用戶看到直接代碼的報錯已骇,需要給客戶友好的提示闭翩。

異常一般是程序中無法完全避免,一般通過一定的手段浸船,盡量減少異常的發(fā)生妄迁。提高代碼的健壯性。

看如下示例:

print('-----test--1---')

open('123.txt','r')

print('-----test--2---')

運行結果:

說明:

打開一個不存在的文件123.txt李命,當找不到123.txt文件時登淘,就會拋出給我們一個IOError類型的錯誤,No?such?file?or?directory:123.txt(沒有123.txt這樣的文件或目錄)

異常:

當Python檢測到一個錯誤時封字,解釋器就無法繼續(xù)執(zhí)行了黔州,反而出現(xiàn)了一些錯誤的提示,這就是所謂的"異常"

1.2:捕獲異常

1.2.1捕獲異常try...except...

try:

?????????? print('-----test--1---')

?????????? open('123.txt','r')

?????????? print('-----test--2---')

exceptIOError:

??????????? pass

說明:

·此程序看不到任何錯誤阔籽,因為用except捕獲到了IOError異常流妻,并添加了處理的方法

·pass表示實現(xiàn)了相應的實現(xiàn),但什么也不做笆制;如果把pass改為print語句绅这,那么就會輸出其他信息

小總結:


·

·把可能出現(xiàn)問題的代碼,放在try中

·把處理異常的代碼在辆,放在except中

1.2.2:except捕獲多個異常

看如下示例:

try:

??????? ?? printnum

exceptIOError:

?????????? print('產(chǎn)生錯誤了')

運行結果如下:

想一想:

上例程序证薇,已經(jīng)使用except來捕獲異常了,為什么還會看到錯誤的信息提示匆篓?

答:

except捕獲的錯誤類型是IOError浑度,而此時程序產(chǎn)生的異常為NameError,所以except沒有生效

修改后的代碼為:

try:

?????????? print??? num

?except??? NameError:

?????????? print('產(chǎn)生錯誤了')

運行結果如下:

實際開發(fā)中奕删,捕獲多個異常的方式俺泣,如下:

#coding=utf-8

try:

????????? print('-----test--1---')

????????? open('123.txt','r')#如果123.txt文件不存在,那么會產(chǎn)生IOError異常

????????? print('-----test--2---')

?????????? print(num)#如果num變量沒有定義完残,那么會產(chǎn)生NameError異常

except(IOError,NameError):

?????? #如果想通過一次except捕獲到多個異常可以用一個元組的方式

????????? #?errorMsg里會保存捕獲到的錯誤信息

print(errorMsg)

注意:

·當捕獲多個異常時横漏,可以把要捕獲的異常的名字谨设,放到except后,并使用元組的方式僅進行存儲



1.3:else:

咱們應該對else并不陌生缎浇,在if中扎拣,它的作用是當條件不滿足時執(zhí)行的實行;同樣在try...except...中也是如此,即如果沒有捕獲到異常二蓝,那么就執(zhí)行else中的事情


1.4:try...finally...

try...finally...語句用來表達這樣的情況:

在程序中誉券,如果一個段代碼必須要執(zhí)行,即無論異常是否產(chǎn)生都要執(zhí)行刊愚,那么此時就需要使用finally踊跟。?比如文件關閉,釋放鎖鸥诽,把數(shù)據(jù)庫連接返還給連接池等

demo:

importtime

try:

?????? f?=?open('test.txt')

????? try:

???????????? whileTrue:

??????????????????? content?=?f.readline()

????????????????? ? if len(content)?==0:

?????????????????????? break

??????????????????? time.sleep(2)

??????????????????? print(content)

except:

#如果在讀取文件的過程中商玫,產(chǎn)生了異常,那么就會捕獲到

#比如?按下了ctrl+c

??????????????? pass

finally:

??????????????? f.close()

???????????????? print('關閉文件')

except:

???????????? print("沒有這個文件")

說明:

test.txt文件中每一行數(shù)據(jù)打印牡借,但是我有意在每打印一行之前用time.sleep方法暫停2秒鐘拳昌。這樣做的原因是讓程序運行得慢一些。在程序運行的時候钠龙,按Ctrl+c中斷(取消)程序炬藤。

我們可以觀察到KeyboardInterrupt異常被觸發(fā),程序退出碴里。但是在程序退出之前刻像,finally從句仍然被執(zhí)行,把文件關閉并闲。


1.5:try嵌套中

importtime

try:

??????? f?=?open('test.txt')

??????? try:

??????????????? whileTrue:

???????????????????? content?=?f.readline()

????????????????????? if? len(content)?==0:

?????????????????????????? break

?????????????????????? time.sleep(2)

??????????????????????? print(content)

???? finally:

?????????????? f.close()

??????????????? print('關閉文件')

except:

???????????? print("沒有這個文件")

運行結果:

In?[26]:?import?time

...:?try:

...:?????f?=?open('test.txt')

...:?????try:

...:?????????while?True:

...:?????????????content?=?f.readline()

...:?????????????if?len(content)?==?0:

...:?????????????????break

...:?????????????time.sleep(2)

...:?????????????print(content)

...:?????finally:

...:?????????f.close()

...:?????????print('關閉文件')

...:?except:

...:?????print("沒有這個文件")

...:?finally:

...:?????print("最后的finally")

...:

xxxxxxx--->這是test.txt文件中讀取到信息

^C關閉文件

沒有這個文件

最后的finally

1.5.2:函數(shù)嵌套調(diào)用中

deftest1():

???????????? ? ?? print("----test1-1----")

????????????????? print(num)

????????????? ?? ? print("----test1-2----")

deftest2():

??????????????????? print("----test2-1----")

??????????????????? test1()

??????????????????? print("----test2-2----")

deftest3():

????????????? try:

????????????????????? print("----test3-1----")

?????????????????????? test1()

??????????????????????? print("----test3-2----")

except? Exceptionasresult:

?????????????????????? print("捕獲到了異常细睡,信息是:%s"%result)

????????? print("----test3-2----")

test3()

print("------華麗的分割線-----")

test2()

運行結果:





總結:

·如果try嵌套,那么如果里面的try沒有捕獲到這個異常帝火,那么外面的try會接收到這個異常溜徙,然后進行處理,如果外邊的try依然沒有捕獲到犀填,那么再進行傳遞蠢壹。。九巡。

·如果一個異常是在一個函數(shù)中產(chǎn)生的图贸,例如函數(shù)A---->函數(shù)B---->函數(shù)C,而異常是在函數(shù)C中產(chǎn)生的,那么如果函數(shù)C中沒有對這個異常進行處理冕广,那么這個異常會傳遞到函數(shù)B中疏日,如果函數(shù)B有異常處理那么就會按照函數(shù)B的處理方式進行執(zhí)行;如果函數(shù)B也沒有異常處理撒汉,那么這個異常會繼續(xù)傳遞沟优,以此類推。睬辐。挠阁。如果所有的函數(shù)都沒有處理宾肺,那么此時就會進行異常的默認處理,即通常見到的那樣

·注意觀察上圖中侵俗,當調(diào)用test3函數(shù)時锨用,在test1函數(shù)內(nèi)部產(chǎn)生了異常,此異常被傳遞到test3函數(shù)中完成了異常處理隘谣,而當異常處理完后增拥,并沒有返回到函數(shù)test1中進行執(zhí)行,而是在函數(shù)test3中繼續(xù)執(zhí)行

1.6:拋出自定義的異常

你可以用raise語句來引發(fā)一個異常洪橘。異常/錯誤對象必須有一個名字跪者,且它們應是Error或Exception類的子類

下面是一個引發(fā)異常的例子:

class?? ShortInputException(Exception):

???????????? '''自定義的異常類'''

????????????? def__init__(self,?length,?atleast):

??????????????? ? ? ? ?? #super().__init__()

??????????????????????? self.length?=?length

???????????????????????? self.atleast?=?atleast

def?? main():

?????? try:

?????????? ? s?=?input('請輸入-->?')

????????? ? ? if? len(s)?<3:

????????????????? #?raise引發(fā)一個你定義的異常

????????????????? raise? ShortInputException(len(s),3)

??????? except?? ShortInputExceptionasresult:?? #x這個變量被綁定到了錯誤的實例

?????????????????? print('ShortInputException:? 輸入的長度是%d,長度至少應是%d'%?(result.length,?result.atleast))

???????? else:

?????????????????? print('沒有異常發(fā)生.')

main()


注意

·以上程序中,關于代碼#super().__init__()的說明

這一行代碼熄求,可以調(diào)用也可以不調(diào)用渣玲,建議調(diào)用,因為__init__方法往往是用來對創(chuàng)建完的對象進行初始化工作弟晚,如果在子類中重寫了父類的__init__方法忘衍,即意味著父類中的很多初始化工作沒有做,這樣就不保證程序的穩(wěn)定了卿城,所以在以后的開發(fā)中枚钓,如果重寫了父類的__init__方法,最好是先調(diào)用父類的這個方法瑟押,然后再添加自己的功能


1.7:異常處理中拋出異常


運行結果:



?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搀捷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子多望,更是在濱河造成了極大的恐慌嫩舟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀偷,死亡現(xiàn)場離奇詭異家厌,居然都是意外死亡,警方通過查閱死者的電腦和手機椎工,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門饭于,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人维蒙,你說我怎么就攤上這事掰吕。” “怎么了木西?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵畴栖,是天一觀的道長。 經(jīng)常有香客問我八千,道長吗讶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任恋捆,我火速辦了婚禮照皆,結果婚禮上,老公的妹妹穿的比我還像新娘沸停。我一直安慰自己膜毁,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布愤钾。 她就那樣靜靜地躺著瘟滨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪能颁。 梳的紋絲不亂的頭發(fā)上杂瘸,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音伙菊,去河邊找鬼败玉。 笑死,一個胖子當著我的面吹牛镜硕,可吹牛的內(nèi)容都是我干的运翼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼兴枯,長吁一口氣:“原來是場噩夢啊……” “哼血淌!你這毒婦竟也來了?” 一聲冷哼從身側響起财剖,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悠夯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峰伙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疗疟,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年瞳氓,在試婚紗的時候發(fā)現(xiàn)自己被綠了策彤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡匣摘,死狀恐怖店诗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情音榜,我是刑警寧澤庞瘸,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站赠叼,受9級特大地震影響擦囊,放射性物質(zhì)發(fā)生泄漏违霞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一瞬场、第九天 我趴在偏房一處隱蔽的房頂上張望买鸽。 院中可真熱鬧,春花似錦贯被、人聲如沸眼五。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽看幼。三九已至,卻和暖如春幌陕,著一層夾襖步出監(jiān)牢的瞬間诵姜,已是汗流浹背俐银。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工囊卜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人檩赢。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓搬卒,卻偏偏與公主長得像瑟俭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子契邀,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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

  • 1異常 1.1異常簡介 異常就是程序運行錯誤或者邏輯混亂摆寄。不能讓用戶看到直接代碼的報錯,需要給客戶友好的提示坯门。 異...
    步_塵閱讀 565評論 0 0
  • 1異常 1.1異常簡介 異常就是程序運行錯誤或者邏輯混亂微饥。需要給客戶友好的提示。 異常一般是程序中無法完全避免古戴,一...
    西多的大叔閱讀 782評論 0 0
  • 1.1異常簡介 異常就是程序運行錯誤或者邏輯混亂欠橘。需要給客戶友好的提示。 異常一般是程序中無法完全避免现恼,一般通過一...
    TENG書閱讀 303評論 0 0
  • 是誰在深夜 看落淚的言語叉袍。始锚。。是誰的往事 在風中悄悄散去喳逛。瞧捌。。
    愈夜愈美麗閱讀 374評論 0 0
  • 如果兩個人的天堂 象是溫馨的墻 囚禁你的夢想 幸福是否象是一扇鐵窗 候鳥失去了南方 如果你對天空向往 渴望一雙翅膀...
    墜落的晨光閱讀 3,839評論 0 1