[英]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.TextIOBase和io.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.