簡體   English   中英

在哪里可以找到有關現有 Python3 API 可能引發的異常的文檔?

[英]Where can I find documentation for possible raised Exceptions for existing Python3 API's?

如果我有一小段代碼,例如,

try:
    file = open(file_name):
except IOError as e:
    ...
else:
    f.read()
finally:
    f.close()

我知道我需要使用 Python with但這純粹是為了教育代碼。

在此示例中,如果文件尚未打開,調用f.read()是否有可能出錯? 我的意思是我可以添加一個斷點,然后在文件打開后將其刪除。

但是,如果不考慮在哪些情況下可以找到從f.read()引發的所有可能異常,我似乎無法通過查看 Python3 文檔找到它們。

一般來說,所有的異常都是一個基礎異常(BaseException)class的實例,從文檔中可以看到庫可以實現的所有基礎異常,以及更詳細的解釋。 這里的鏈接: https://github.com/python/cpython/blob/3.9/Doc/library/exceptions.rst

您的第一站確實應該是官方 Python 文檔。

這是.open()的一個,其中提到了它可能引發的一些異常,例如:

'strict'在存在編碼錯誤時引發 ValueError 異常

現在對於.read() ,它取決於.open()返回什么,文檔說它返回一個文件 object ,它又具有不同的類型:

open() function 返回的文件類型 object 取決於模式。 當 open() 用於以文本模式( 'w''r''wt''rt'等)打開文件時,它返回io.TextIOBase的子類(具體為 io.TextIOWrapper )。 當用於以帶緩沖的二進制模式打開文件時,返回的 class 是io.BufferedIOBase的子類。 確切的 class 有所不同:在讀取二進制模式下,它返回一個io.BufferedReader 在寫二進制和 append 二進制模式下,它返回一個io.BufferedWriter ,在讀/寫模式下,它返回一個io.BufferedRandom 禁用緩沖時,將返回原始stream ,即 io.RawIOBase io.FileIO的子類。

假設它返回了一個文本文件 object,那么您可以通過io.TextIOBaseio.TextIOWrapper的文檔再次go。 那里有一些提示,以及 class 及其方法引發的異常類型。 io.TextIOBase下,您會找到.read()的方法描述,它確實沒有明確說明引發的異常類型。

如果您無法從文檔中找到它,可能會有點令人生畏,但您始終可以在https://github.com/python/cpython上查看源代碼。 這是io模塊(截至 Python 3.9.6)的模塊: https://github.com/python/cpython/blob/v3.9.6/Lib/_pyio.py

特別是對於.open() ,您會看到所有不同的raise...您可以捕獲的代碼。 對於.read ,您必須再次找到正確的 class。這是io.TextIOWrapper.read()的片段:

    def read(self, size=None):
        self._checkReadable()
        if size is None:
            size = -1
        else:
            try:
                size_index = size.__index__
            except AttributeError:
                raise TypeError(f"{size!r} is not an integer")

這表明如果您傳遞了非整數大小,它可能會引發TypeError

此外,與所有異常一樣,有時您不需要專門捕獲它們中的每一個。 有時您只需要捕獲父異常 class。為此,如Mark Tolonen 的評論中所述,您可以檢查異常層次結構以查看您只需要處理哪些異常。

最后,盡管通過反復試驗看看會發生什么,但沒有錯,就像你說的那樣:

我的意思是我可以添加一個斷點,然后在文件打開后將其刪除。

這是測試派上用場的地方。 您為某些行為和錯誤情況編寫測試,您的代碼將因未處理的異常而失敗,因此您更新代碼以正確處理該異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM