App下載

python怎么處理異常?如何觸發(fā)?

猿友 2021-06-25 16:14:14 瀏覽數(shù) (2853)
反饋

很多小伙伴在剛開始學習python的時候往往會出現(xiàn)一大堆的錯誤。有些錯誤屬于語法錯誤,我們可以通過代碼檢查來找出這種錯誤,但有些錯誤是莫名其妙的。因為代碼是沒有問題的,但是運行時偶爾會出現(xiàn)一些特殊情況導致代碼無法繼續(xù)運行下去,這就是異常。python異常有哪幾種呢?接下來小編就帶你了解一下python的異常,以及如何進行python異常處理。

什么是異常?

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

舉個例子:程序需要打開一個文件并做一些處理,但是這個文件并不存在。python代碼在運行到打開這個文件這個步驟,因為沒有這個文件,也就沒有辦法打開這個文件,沒有辦法打開文件也就沒有辦法進行文件的處理。這就是一個異常(一個文件打開異常)。

產生異常的原因

因為程序在運行時總是可能會發(fā)生一些無法預料到的環(huán)境,所以產生的異常各有不同,比如說文件不存在,打開文件操作就會出現(xiàn)異常也有程序員在開發(fā)的時候不遵守規(guī)范導致的異常(比如除數(shù)不能為零,當除數(shù)為零是會報除零異常,還有數(shù)組操作越界異常等,這些都是初學者比較常見的異常)。

 有沒有發(fā)現(xiàn)python的異常和java的很像?沒錯,異常機制在很多編程語言中都存在,比如java,JavaScript,python等,但是他們在細節(jié)上可能會有所不同,比如python的異常捕獲使用的關鍵字就與java的不一樣,而且python還有一些特別的功能。接下來我們就來介紹一下python如何捕獲異常吧!

python 內置異常的種類

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

異常的處理

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

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

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

from random import randint

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

 raise只能使用python中內置提供的異常類。

小結

以上就是小編要介紹的java異常有哪幾種的詳細內容。部分內容參考了W3Cschool的python手冊。如果需要更深入的了解python異常,可以前往python手冊-異常處理進行學習。


0 人點贊