在python開(kāi)發(fā)中,代碼書(shū)寫(xiě)時(shí)難免有疏忽或者意向不到的bug,導(dǎo)致程序run的過(guò)程中有可能會(huì)直接崩潰;然后對(duì)于程序猿而言,程序因bug崩潰是家常便飯,為了增加程序的健壯性,防止程序崩潰,我們可以對(duì)程序的有可能發(fā)生崩潰的代碼增加異常處理,以達(dá)到程序穩(wěn)健運(yùn)行的目的。
成都創(chuàng)新互聯(lián)專注于彌渡網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供彌渡營(yíng)銷型網(wǎng)站建設(shè),彌渡網(wǎng)站制作、彌渡網(wǎng)頁(yè)設(shè)計(jì)、彌渡網(wǎng)站官網(wǎng)定制、小程序定制開(kāi)發(fā)服務(wù),打造彌渡網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供彌渡網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
?
一般情況,python無(wú)法正常處理程序時(shí),就是會(huì)產(chǎn)生異常,舉個(gè)例子:
1.大家都知道分母不能為0,如果分母為0,程序必然崩潰;
1 2 3 | x=3/0 ? 程序崩潰/報(bào)錯(cuò):ZeroDivisionError:divisionbyzero |
?
2.假如 python文件讀寫(xiě) 中,我們講解了文件的讀寫(xiě)操作,如果我們對(duì)一個(gè)不存在的文件讀取內(nèi)容,程序必然也會(huì)崩潰;
1 2 3 4 | # 讀取123.txt文件,實(shí)際上該文件并不存在 fp=open("123.txt","r") ? 程序崩潰/報(bào)錯(cuò):FileNotFoundError:[Errno2]Nosuchfileordirectory:'123.txt' |
?
對(duì)于以上的各種異常情況,我們可以通過(guò)?try…except…解決,那么具體有哪些異常能捕獲呢?如下所示:
1.BaseException?— 所有異常的基類
2.SystemExit?— 解釋器請(qǐng)求退出
3.KeyboardInterrupt?— 用戶中斷執(zhí)行(通常是輸入^C)
4.Exception?— 常規(guī)錯(cuò)誤的基類
5.StopIteration?— 迭代器沒(méi)有更多的值
6.GeneratorExit?— 生成器(generator)發(fā)生異常來(lái)通知退出
7.StandardError?— 所有的內(nèi)建標(biāo)準(zhǔn)異常的基類
8.ArithmeticError?— 所有數(shù)值計(jì)算錯(cuò)誤的基類
9.FloatingPointError?— 浮點(diǎn)計(jì)算錯(cuò)誤
10.OverflowError?— 數(shù)值運(yùn)算超出最大限制
11.ZeroDivisionError?— 除(或取模)零 (所有數(shù)據(jù)類型)
12.AssertionError?— 斷言語(yǔ)句失敗
13.AttributeError?— 對(duì)象沒(méi)有這個(gè)屬性
14.EOFError?— 沒(méi)有內(nèi)建輸入,到達(dá)EOF 標(biāo)記
15.EnvironmentError?— 操作系統(tǒng)錯(cuò)誤的基類
16.IOError?— 輸入/輸出操作失敗
17.OSError?— 操作系統(tǒng)錯(cuò)誤
18.WindowsError?— 系統(tǒng)調(diào)用失敗
19.ImportError?— 導(dǎo)入模塊/對(duì)象失敗
20.LookupError?— 無(wú)效數(shù)據(jù)查詢的基類
21.IndexError?— 列中沒(méi)有此索引(index)
22.KeyError?— 映射中沒(méi)有這個(gè)鍵
23.MemoryError?— 內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的)
24.NameError?— 未聲明/初始化對(duì)象 (沒(méi)有屬性)
25.UnboundLocalError?— 訪問(wèn)未初始化的本地變量
26.ReferenceError?— 弱引用(Weak reference)試圖訪問(wèn)已經(jīng)垃圾回收了的對(duì)象
27.RuntimeError?— 一般的運(yùn)行時(shí)錯(cuò)誤
28.NotImplementedError?— 尚未實(shí)現(xiàn)的方法
29.SyntaxError?— Python 語(yǔ)法錯(cuò)誤
30.IndentationError?— 縮進(jìn)錯(cuò)誤
31.TabError?—? Tab 和空格混用
32.SystemError?— 一般的解釋器系統(tǒng)錯(cuò)誤
33.TypeError?— 對(duì)類型無(wú)效的操作
34.ValueError?— 傳入無(wú)效的參數(shù)
35.UnicodeError?— Unicode 相關(guān)的錯(cuò)誤
36.UnicodeDecodeError?— Unicode 解碼時(shí)的錯(cuò)誤
37.UnicodeEncodeError?— Unicode 編碼時(shí)錯(cuò)誤
38.UnicodeTranslateError?— Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤
39.Warning?— 警告的基類
40.DeprecationWarning?— 關(guān)于被棄用的特征的警告
41.FutureWarning?— 關(guān)于構(gòu)造將來(lái)語(yǔ)義會(huì)有改變的警告
42.OverflowWarning?— 舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告
43.PendingDeprecationWarning?— 關(guān)于特性將會(huì)被廢棄的警告
44.RuntimeWarning?— 可疑的運(yùn)行時(shí)行為(runtime behavior)的警告
45.SyntaxWarning?— 可疑的語(yǔ)法的警告
46.UserWarning?— 用戶代碼生成的警告
?
1 2 3 4 | try: ????<代碼> except: ????print("異常說(shuō)明") |
示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個(gè)人博客地址): shuopython.com @WeChat Official Account(微信公眾號(hào)):猿說(shuō)python @Github:www.github.com @File:try_except.py @Time:2019/10/9 21:27 ? @Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! """ ? try: ????x=3/0# 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼 ????print("hello world") except: ????print("異常說(shuō)明:分母不能為0") ? print("程序正常結(jié)束") |
輸出結(jié)果:
1 2 | 異常說(shuō)明:分母不能為0 程序正常結(jié)束 |
?
1 2 3 4 | try: ????<語(yǔ)句> except<異常名>: ????print('異常說(shuō)明') |
示例代碼:
1 2 3 4 5 6 7 8 | try: ????fp=open("123.txt","r")# 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼 ????print("hello world") ????fp.close() exceptIOError: ????print("異常說(shuō)明:文件讀取失敗") ? print("程序正常結(jié)束") |
輸出結(jié)果:
1 2 | 異常說(shuō)明:文件讀取失敗 程序正常結(jié)束 |
?
1 2 3 4 5 6 7 8 | try: ????<語(yǔ)句> except<異常名1>: ????print('異常說(shuō)明1') except<異常名2>: ????print('異常說(shuō)明2') except<異常名3>: ????print('異常說(shuō)明3') |
該種異常處理語(yǔ)法的規(guī)則是:
a.執(zhí)行try下的語(yǔ)句,如果引發(fā)異常,則執(zhí)行過(guò)程會(huì)跳到第一個(gè)except語(yǔ)句。
b.如果第一個(gè)except中定義的異常名與引發(fā)的異常匹配,則執(zhí)行該except中的語(yǔ)句。
c.如果引發(fā)的異常不匹配第一個(gè)except,則會(huì)搜索第二個(gè)except,允許編寫(xiě)的except數(shù)量沒(méi)有限制。
d.如果所有的except都不匹配,則異常會(huì)傳遞到下一個(gè)調(diào)用本代碼的最高層try代碼中。
示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | try: ????fp=open("123.txt","r")# 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼 ????print("hello world") ????fp.close() exceptGeneratorExit: ????print("異常說(shuō)明:GeneratorExit") exceptFloatingPointError: ????print("異常說(shuō)明:FloatingPointError") exceptOverflowError: ????print("異常說(shuō)明:OverflowError") exceptZeroDivisionError: ????print("異常說(shuō)明:ZeroDivisionError") exceptIOError: ????print("異常說(shuō)明:IOError") ? print("程序正常結(jié)束") |
輸出結(jié)果:
1 2 | 異常說(shuō)明:IOError 程序正常結(jié)束 |
?
1 2 3 4 | try: ????<語(yǔ)句> exceptExceptionase:# 自動(dòng)識(shí)別異常信息,并將異常信息保存在e中 ????print('異常說(shuō)明:',e) |
示例代碼:
1 2 3 4 5 6 7 8 | try: ????fp=open("python.txt","r")# 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼 ????print("hello world") ????fp.close() exceptExceptionase: ????print("異常說(shuō)明:",e) ? print("程序正常結(jié)束") |
輸出結(jié)果:
1 2 | 異常說(shuō)明:[Errno2]Nosuchfileordirectory:'python.txt' 程序正常結(jié)束 |
?
?
如果判斷完沒(méi)有異常之后還想做其他事,就可以使用下面這樣的else語(yǔ)句,注意:是在try中沒(méi)有異常情況下,才會(huì)執(zhí)行else之后的代碼。
1 2 3 4 5 6 7 8 | try: ????<語(yǔ)句> except<異常名1>: ????print('異常說(shuō)明1') except<異常名2>: ????print('異常說(shuō)明2') else: ????<語(yǔ)句>??# try語(yǔ)句中沒(méi)有異常則執(zhí)行此段代碼 |
示例代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | try: ????print("hello world") exceptGeneratorExit: ????print("異常說(shuō)明:GeneratorExit") exceptFloatingPointError: ????print("異常說(shuō)明:FloatingPointError") exceptOverflowError: ????print("異常說(shuō)明:OverflowError") exceptZeroDivisionError: ????print("異常說(shuō)明:ZeroDivisionError") else: ????print("i love you") ? print("程序正常結(jié)束") |
輸出結(jié)果:
1 2 3 | helloworld iloveyou 程序正常結(jié)束 |
?
try…finally…語(yǔ)句無(wú)論是否發(fā)生異常都將會(huì)執(zhí)行最后的代碼。
1 2 3 4 | try: ????<語(yǔ)句> finally: ????<語(yǔ)句> |
示例代碼:
1 2 3 4 5 6 7 8 9 10 | try: ????fp=open("python.txt","r")# 程序出現(xiàn)異常,不會(huì)繼續(xù)執(zhí)行后面的代碼 ????print("hello world") ????fp.close() exceptExceptionase: ????print("異常說(shuō)明:",e) finally: ????print("finally")# 無(wú)論是否發(fā)生異常都將會(huì)執(zhí)行最后的代碼 ? print("程序正常結(jié)束") |
輸出結(jié)果:
1 2 3 | 異常說(shuō)明:[Errno2]Nosuchfileordirectory:'python.txt' finally 程序正常結(jié)束 |
?
可以使用raise語(yǔ)句自己觸發(fā)異常,語(yǔ)法如下:
1 | raise[Exception[,args[,traceback]]] |
語(yǔ)句中 Exception 是異常的類型(例如,IOError?)參數(shù)標(biāo)準(zhǔn)異常中任一種,args 是自已提供的異常參數(shù)。最后一個(gè)參數(shù)是可選的(在實(shí)踐中很少使用),如果存在,是跟蹤異常對(duì)象;示例代碼如下:
1 2 3 4 5 6 7 | try: ????raiseException("raise Exception!")??# 觸發(fā)異常后,后面的代碼就不會(huì)再執(zhí)行 ????print("hello world") exceptExceptionase: ????print(e) finally: ????print("OK") |
輸出結(jié)果:
1 2 | raiseException! OK |
?
在python開(kāi)發(fā)中,為了增加程序的健壯性,異常處理try…except…是必須掌握的內(nèi)容.
?
1.python文件讀寫(xiě)操作
2.python內(nèi)置函數(shù)input/eval
?
轉(zhuǎn)載請(qǐng)注明:猿說(shuō)Python???python異常處理
新聞標(biāo)題:python異常處理(25)
文章源于:http://aaarwkj.com/article26/jpogcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、動(dòng)態(tài)網(wǎng)站、軟件開(kāi)發(fā)、網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)