python21-異常處理

調(diào)試Python程序時(shí)經(jīng)常會(huì)報(bào)出一些異常,這時(shí)就需要我們對(duì)異常進(jìn)行捕獲處理,防止程序終止,本篇主要圍繞異常處理操作而展開。希望感興趣的小伙伴可以堅(jiān)持看下去同時(shí)歡迎提出寶貴的意見讓我們一起進(jìn)步!

01:什么是異常?

1)概念:異常即是一個(gè)事件,該事件會(huì)在程序執(zhí)行過程中發(fā)生,影響了程序的正常執(zhí)行。異常是Python對(duì)象,表示一個(gè)錯(cuò)誤

2)注意事項(xiàng):

①一般情況下,在Python無法正常處理程序時(shí)就會(huì)發(fā)生一個(gè)異常。

②當(dāng)Python腳本發(fā)生異常時(shí)我們需要捕獲處理它,否則程序會(huì)終止執(zhí)行。

3)異常作用: 出現(xiàn)異常程序不要退出,可以繼續(xù)執(zhí)行同時(shí)給予程序員一定的異常提示信息

02:常見的異常種類
異常名稱 異常描述
SyntaxError 語法錯(cuò)誤時(shí)會(huì)拋出此異常
NameError 使用一個(gè)還未被賦予對(duì)象的變量
TypeError 傳入對(duì)象類型與要求的不符合
ZeroDivisionError 進(jìn)行數(shù)學(xué)運(yùn)算時(shí)除數(shù)為0時(shí)會(huì)出現(xiàn)此異常
IndexError 下標(biāo)索引超出序列邊界
KeyError 試圖訪問字典里不存在的鍵
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯(cuò)誤
IndentationError 代碼沒有正確對(duì)齊,即縮進(jìn)錯(cuò)誤
ValueError 傳入一個(gè)調(diào)用者不期望的值,即傳入無效的參數(shù)
AssertionError 當(dāng)assert斷言條件為假的時(shí)候拋出的異常
OSError 操作系統(tǒng)異常

更多詳細(xì)的錯(cuò)誤參考:https://www.runoob.com/python/python-exceptions.html

03:異常捕獲關(guān)鍵字
異常名稱 異常描述
try/except 捕獲異常并處理
pass 忽略異常
as 定義異常實(shí)例(except MyError as e)
else 如果try中的語句沒有引發(fā)異常,則執(zhí)行else中的語句
finally 無論是否出現(xiàn)異常,都執(zhí)行的代碼
raise 拋出/引發(fā)異常
04:try與except結(jié)合用法捕獲異常

1)概述:用來檢測try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理。一般捕獲已知異常

2)原理:

①首先執(zhí)行try語句 (try和except關(guān)鍵字之間的(多行)語句)

②如果沒有異常發(fā)生,則跳過except語句完成try語句的執(zhí)行。

③如果在執(zhí)行try語句時(shí)發(fā)生了異常,則跳過該子句中剩下的部分。若異常類型和 except關(guān)鍵字后面的異常匹配,則執(zhí)行 except 語句,然后繼續(xù)執(zhí)行try語句之后的代碼。

④如果發(fā)生的異常和 except 語句中指定的異常不匹配,則將其傳遞到外部的try語句中;如果沒有找到處理程序,則它是一個(gè)未處理異常,程序?qū)⑼V?/strong>。

while True:
    num=input('請(qǐng)輸入數(shù)字:')
    try:
    # 如果除數(shù)為0時(shí)將拋出ZeroDivisionError異常
        print('100/%s=%s'%(num,100.0/int(num)))
    # 如果捕獲到ZeroDivisionError異常將執(zhí)行except下面的代碼塊
    except ZeroDivisionError:#已知異常,一一對(duì)應(yīng)
        print('除數(shù)不能輸入不能為0喲!!')
05:多個(gè)except捕獲異常

1)一個(gè)try語句可能有多個(gè) except 子句,以指定不同異常的處理程序。最多只會(huì)執(zhí)行一個(gè)處理程序

2)一個(gè)except子句可以將多個(gè)異常命名為帶括號(hào)的元組,這種寫法不區(qū)分優(yōu)先級(jí)。except (RuntimeError, TypeError):

while True:
    num=input('請(qǐng)輸入數(shù)字:')
    try:
    # 如果除數(shù)為0時(shí)將拋出ZeroDivisionError異常
        print('100/%s=%s'%(num,100.0/int(num)))
    # 如果捕獲到ZeroDivisionError異常將執(zhí)行except下面的代碼塊
    except ZeroDivisionError:
        print('除數(shù)不能輸入不能為0喲!!')
    except ValueError as error:  # error表示具體的異常信息
        print('除數(shù)不能輸入字符串喲!!', error)
06:try與except與else捕獲異常

1)沒有異常的情況下,要執(zhí)行一段代碼。

2)else 子句在使用時(shí)必須放在所有的 except 代碼塊后面,finally前面

while True:
    num=input('請(qǐng)輸入數(shù)字:')
    try:
        print('100/%s=%s'%(num,100.0/int(num)))
    except ZeroDivisionError:
        print('除數(shù)不能輸入不能為0喲!!')
    except ValueError as error:  
        print('除數(shù)不能輸入字符串喲!!', error)
    else: #當(dāng)try代碼塊中執(zhí)行沒有發(fā)現(xiàn)任何異常的時(shí)候執(zhí)行這里的語句 
        print("Program execution successful")
07:try與except與finally捕獲異常

1)不管是否有異常,都要執(zhí)行一段代碼。finally一般要放到最后

2)finally子句對(duì)于釋放外部資源非常有用

3)應(yīng)用場景:用在打開文件,在文件處理過程過中出異常退出,這時(shí)文件沒有關(guān)閉或者網(wǎng)絡(luò)連接

try:
    txt = open("C:/Users/qin/Desktop/file1.txt")
    # 上面打開文件默認(rèn)以r方式打開,這里會(huì)拋出IOError異常
    txt.write("這是一個(gè)測試文件,用于測試異常!!")
except IOError as e:    # e為異常信息
    print("異常信息為:",e)
finally: #不管有沒有民常都會(huì)執(zhí)行finally代碼塊中的語句
    txt.close()
08:捕獲所有異常(Exception)

1)Exception是所有異常的父類,但是不能通過該程序識(shí)別出具體的異常信息

while True:
    num=input('請(qǐng)輸入數(shù)字:')
    try:
        print('100/%s=%s'%(num,100.0/int(num)))
    except Exception as error:  # 異常的父類:所有異常
         print('有異常!!', error)
09:捕獲具體異常(traceback)

1)traceback可以用來捕獲未知異常具體信息

import traceback#捕獲具體異常信息模塊
while True:
    num=input('請(qǐng)輸入數(shù)字:')
    try:
        print('100/%s=%s'%(num,100.0/int(num)))
    except:
        print('有異常!!', traceback.format_exc())  # 捕獲具體異常信息
10:主動(dòng)觸發(fā)異常(raise)

1)raise語句允許程序員強(qiáng)制發(fā)生指定的異常

2)格式:raise 異常類型; raise也可單獨(dú)使用

for one in range(1,6):
    if one ==2:
        raise ValueError("當(dāng)i等于2時(shí)拋出這個(gè)異常")
    print(one)
11:自定義異常

1)Python中也可以自定義特殊類型的異常,只需要從Exception類繼承(直接或間接)即可

class SomeException(Exception):
    pass
12:斷言(assert)

1)使用場景:如果后續(xù)代碼比較重要且依靠前面的數(shù)據(jù)/狀態(tài)

tel=input('請(qǐng)輸入手機(jī)號(hào):')
assert len(tel)==11,'手機(jī)號(hào)位數(shù)有誤'
print('我在測試手機(jī)號(hào)長度')
13:捕獲異常注意事項(xiàng)

1)常用的異常場景:WebUI元素定位、打開文件、數(shù)據(jù)庫連接、調(diào)用接口等

2)不是所有的代碼都做異常處理,會(huì)使代碼邏輯看起來復(fù)雜化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • python提供了兩個(gè)非常重要的功能來處理python程序在運(yùn)行中出現(xiàn)的異常和錯(cuò)誤。你可以使用該功能來調(diào)試pyth...
    _寧采臣閱讀 1,095評(píng)論 0 10
  • @[toc]??編寫計(jì)算機(jī)程序時(shí),通常能夠區(qū)分正常和異常情況。異常事件可能是錯(cuò)誤,也可能是通常不會(huì)發(fā)生的事情。為處...
    奮斗在阿爾卑斯的皮卡丘閱讀 907評(píng)論 0 0
  • 一、概要 ? 一個(gè)程序即使沒有任何語法錯(cuò)誤,即使解題的邏輯也正確,在執(zhí)行的時(shí)候仍然可能出現(xiàn) 各種“運(yùn)行時(shí)錯(cuò)誤”,導(dǎo)...
    唯老閱讀 511評(píng)論 0 1
  • 一、簡介 Python最強(qiáng)大的結(jié)構(gòu)之一就是它的異常處理能力,所有的標(biāo)準(zhǔn)異常都使用類來實(shí)現(xiàn),都是基類Exceptio...
    隨風(fēng)化作雨閱讀 3,147評(píng)論 0 1
  • 一、錯(cuò)誤和異常 1、錯(cuò)誤 從軟件方面來講,錯(cuò)誤通常是語法或邏輯上的。語法錯(cuò)誤會(huì)導(dǎo)致程序代碼不能被解釋器解釋,這些錯(cuò)...
    常大鵬閱讀 1,638評(píng)論 0 6

友情鏈接更多精彩內(nèi)容