溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python怎么觸發(fā)并處理異常

發(fā)布時(shí)間:2022-02-23 10:25:38 來(lái)源:億速云 閱讀:168 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“python怎么觸發(fā)并處理異?!保闹械闹v解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“python怎么觸發(fā)并處理異?!卑?!

什么是異常?

程序的異常指的是程序在運(yùn)行時(shí),發(fā)生了一些不被期望的事件,而這些事件阻止了程序按照預(yù)期進(jìn)行正常執(zhí)行,這就是異常。

舉個(gè)例子:程序需要打開一個(gè)文件并做一些處理,但是這個(gè)文件并不存在。python代碼在運(yùn)行到打開這個(gè)文件這個(gè)步驟,因?yàn)闆](méi)有這個(gè)文件,也就沒(méi)有辦法打開這個(gè)文件,沒(méi)有辦法打開文件也就沒(méi)有辦法進(jìn)行文件的處理。這就是一個(gè)異常(一個(gè)文件打開異常)。

產(chǎn)生異常的原因

因?yàn)槌绦蛟谶\(yùn)行時(shí)總是可能會(huì)發(fā)生一些無(wú)法預(yù)料到的環(huán)境,所以產(chǎn)生的異常各有不同,比如說(shuō)文件不存在,打開文件操作就會(huì)出現(xiàn)異常也有程序員在開發(fā)的時(shí)候不遵守規(guī)范導(dǎo)致的異常(比如除數(shù)不能為零,當(dāng)除數(shù)為零是會(huì)報(bào)除零異常,還有數(shù)組操作越界異常等,這些都是初學(xué)者比較常見(jiàn)的異常)。

 有沒(méi)有發(fā)現(xiàn)python的異常和java的很像?沒(méi)錯(cuò),異常機(jī)制在很多編程語(yǔ)言中都存在,比如java,JavaScript,python等,但是他們?cè)诩?xì)節(jié)上可能會(huì)有所不同,比如python的異常捕獲使用的關(guān)鍵字就與java的不一樣,而且python還有一些特別的功能。

python 內(nèi)置異常的種類

BaseException  # 所有異常的基類
 +-- SystemExit  # 解釋器請(qǐng)求退出
 +-- KeyboardInterrupt  # 用戶中斷執(zhí)行(通常是輸入^C)
 +-- GeneratorExit  # 生成器(generator)發(fā)生異常來(lái)通知退出
 +-- Exception  # 常規(guī)異常的基類
      +-- StopIteration  # 迭代器沒(méi)有更多的值
      +-- StopAsyncIteration  # 必須通過(guò)異步迭代器對(duì)象的__anext__()方法引發(fā)以停止迭代
      +-- ArithmeticError  # 各種算術(shù)錯(cuò)誤引發(fā)的內(nèi)置異常的基類
      |    +-- FloatingPointError  # 浮點(diǎn)計(jì)算錯(cuò)誤
      |    +-- OverflowError  # 數(shù)值運(yùn)算結(jié)果太大無(wú)法表示
      |    +-- ZeroDivisionError  # 除(或取模)零 (所有數(shù)據(jù)類型)
      +-- AssertionError  # 當(dāng)assert語(yǔ)句失敗時(shí)引發(fā)
      +-- AttributeError  # 屬性引用或賦值失敗
      +-- BufferError  # 無(wú)法執(zhí)行與緩沖區(qū)相關(guān)的操作時(shí)引發(fā)
      +-- EOFError  # 當(dāng)input()函數(shù)在沒(méi)有讀取任何數(shù)據(jù)的情況下達(dá)到文件結(jié)束條件(EOF)時(shí)引發(fā)
      +-- ImportError  # 導(dǎo)入模塊/對(duì)象失敗
      |    +-- ModuleNotFoundError  # 無(wú)法找到模塊或在在sys.modules中找到None
      +-- LookupError  # 映射或序列上使用的鍵或索引無(wú)效時(shí)引發(fā)的異常的基類
      |    +-- IndexError  # 序列中沒(méi)有此索引(index)
      |    +-- KeyError  # 映射中沒(méi)有這個(gè)鍵
      +-- MemoryError  # 內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的)
      +-- NameError  # 未聲明/初始化對(duì)象 (沒(méi)有屬性)
      |    +-- UnboundLocalError  # 訪問(wèn)未初始化的本地變量
      +-- OSError  # 操作系統(tǒng)錯(cuò)誤,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已合并到OSError中,構(gòu)造函數(shù)可能返回子類
      |    +-- BlockingIOError  # 操作將阻塞對(duì)象(e.g. socket)設(shè)置為非阻塞操作
      |    +-- ChildProcessError  # 在子進(jìn)程上的操作失敗
      |    +-- ConnectionError  # 與連接相關(guān)的異常的基類
      |    |    +-- BrokenPipeError  # 另一端關(guān)閉時(shí)嘗試寫入管道或試圖在已關(guān)閉寫入的套接字上寫入
      |    |    +-- ConnectionAbortedError  # 連接嘗試被對(duì)等方中止
      |    |    +-- ConnectionRefusedError  # 連接嘗試被對(duì)等方拒絕
      |    |    +-- ConnectionResetError    # 連接由對(duì)等方重置
      |    +-- FileExistsError  # 創(chuàng)建已存在的文件或目錄
      |    +-- FileNotFoundError  # 請(qǐng)求不存在的文件或目錄
      |    +-- InterruptedError  # 系統(tǒng)調(diào)用被輸入信號(hào)中斷
      |    +-- IsADirectoryError  # 在目錄上請(qǐng)求文件操作(例如 os.remove())
      |    +-- NotADirectoryError  # 在不是目錄的事物上請(qǐng)求目錄操作(例如 os.listdir())
      |    +-- PermissionError  # 嘗試在沒(méi)有足夠訪問(wèn)權(quán)限的情況下運(yùn)行操作
      |    +-- ProcessLookupError  # 給定進(jìn)程不存在
      |    +-- TimeoutError  # 系統(tǒng)函數(shù)在系統(tǒng)級(jí)別超時(shí)
      +-- ReferenceError  # weakref.proxy()函數(shù)創(chuàng)建的弱引用試圖訪問(wèn)已經(jīng)垃圾回收了的對(duì)象
      +-- RuntimeError  # 在檢測(cè)到不屬于任何其他類別的錯(cuò)誤時(shí)觸發(fā)
      |    +-- NotImplementedError  # 在用戶定義的基類中,抽象方法要求派生類重寫該方法或者正在開發(fā)的類指示仍然需要添加實(shí)際實(shí)現(xiàn)
      |    +-- RecursionError  # 解釋器檢測(cè)到超出最大遞歸深度
      +-- SyntaxError  # Python 語(yǔ)法錯(cuò)誤
      |    +-- IndentationError  # 縮進(jìn)錯(cuò)誤
      |         +-- TabError  # Tab和空格混用
      +-- SystemError  # 解釋器發(fā)現(xiàn)內(nèi)部錯(cuò)誤
      +-- TypeError  # 操作或函數(shù)應(yīng)用于不適當(dāng)類型的對(duì)象
      +-- ValueError  # 操作或函數(shù)接收到具有正確類型但值不合適的參數(shù)
      |    +-- UnicodeError  # 發(fā)生與Unicode相關(guān)的編碼或解碼錯(cuò)誤
      |         +-- UnicodeDecodeError  # Unicode解碼錯(cuò)誤
      |         +-- UnicodeEncodeError  # Unicode編碼錯(cuò)誤
      |         +-- UnicodeTranslateError  # Unicode轉(zhuǎn)碼錯(cuò)誤
      +-- Warning  # 警告的基類
           +-- DeprecationWarning  # 有關(guān)已棄用功能的警告的基類
           +-- PendingDeprecationWarning  # 有關(guān)不推薦使用功能的警告的基類
           +-- RuntimeWarning  # 有關(guān)可疑的運(yùn)行時(shí)行為的警告的基類
           +-- SyntaxWarning  # 關(guān)于可疑語(yǔ)法警告的基類
           +-- UserWarning  # 用戶代碼生成警告的基類
           +-- FutureWarning  # 有關(guān)已棄用功能的警告的基類
           +-- ImportWarning  # 關(guān)于模塊導(dǎo)入時(shí)可能出錯(cuò)的警告的基類
           +-- UnicodeWarning  # 與Unicode相關(guān)的警告的基類
           +-- BytesWarning  # 與bytes和bytearray相關(guān)的警告的基類
           +-- ResourceWarning  # 與資源使用相關(guān)的警告的基類。被默認(rèn)警告過(guò)濾器忽略。

異常的處理

在python中,捕獲異常的方式與java不同,他使用的語(yǔ)句為,try-except-finally。代碼如下:

try:
    #嘗試執(zhí)行的可能會(huì)拋出異常的代碼
except 異常類型1 :
    #當(dāng)異常拋出時(shí),根據(jù)異常的類型執(zhí)行對(duì)應(yīng)的語(yǔ)句
    #except語(yǔ)句用來(lái)捕獲異常。
except 異常類型2 :
    // 程序代碼
finally:
    #不管最終如何,一定要執(zhí)行的語(yǔ)句,一般做清理類型等收尾善后性質(zhì)的工作
    #finally不是必要出現(xiàn)的

此外,python還提供了一個(gè)raise方法來(lái)拋出一個(gè)異常信息,以下面代碼為例:

from random import randint

number = randint(1,9)
if number%2==0:
    raise NameError("%d is even" %number) # 雖然判斷奇偶數(shù)跟NameError沒(méi)有關(guān)系,但還是可以通過(guò)raise拋出該異常
else:
    raise NameError("%d is odd" %number)

 raise只能使用python中內(nèi)置提供的異常類。

感謝各位的閱讀,以上就是“python怎么觸發(fā)并處理異?!钡膬?nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)python怎么觸發(fā)并處理異常這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI