在Google的python風格指南檔案中,他們提到了以下內容:
請注意,在檔案的 "Raises: "部分沒有提到這個ValueError的引發。 字串的 "Raises: "部分中沒有提及,因為不適合保證 這種對 API 濫用的特定行為反應。
為什么不合適?這是否意味著ValueError首先就不應該被這樣使用?
def connect_to_next_port(self, minimum: int) -> int:
""連接到下一個可用埠。
Args:
最小值。一個大于或等于1024的埠值。
回傳。
新的最小埠。
引發。
ConnectionError。如果沒有找到可用的埠。
""
if minimum < 1024。
# Note that this raising of ValueError is not mentioned in the doc.
# string的 "Raises: "部分,因為它不適合。
# 保證這種對API誤操作的特定行為反應。
raise ValueError(f'Min. port must be at least 1024, not {minimum}. )
port = self._find_next_open_port(minimum)
if not port。
raise ConnectionError(
f'Could not connect to service on port {minimum} or higher.)
assert port >= minimum, (
f'Unexpected port {port} when minimum was {minimum}. ' )
return port
uj5u.com熱心網友回復:
ConnectionError可能是按照檔案中的用法使用該函式的結果。
ValueError,然而,這只是公然違反該函式的前提條件的結果。你已經被警告過了,minimum >= 1024必須為真。你不需要記錄違反該警告的后果。
例如,你不需要一個try陳述句來處理ValueError;你可以在呼叫函式之前檢查引數的值來避免它。(這是一個請求原諒比請求允許更容易的情況。)
你確實需要一個try陳述句來處理ValueError;你可以在呼叫函式前檢查引數值來避免它。
你確實需要一個try陳述句來處理ConnectionError,因為我們沒有辦法預測它可能發生。為了知道ConnectionError可能被提出,這需要被記錄下來。
從具有靜態型別檢查的總體語言的角度來看,區別在于你可以通過使用適當的argument型別來避免錯誤,以及你可以通過使用適當的return型別來避免錯誤。考慮一下類似Haskell的偽代碼中的部分函式。
type ValidPort = Int
connect_to_next_port :: ValidPort -> ValidPort
connect_to_next_port = ...
但不是任何Int都是有效的埠;只有1024和65535之間的整數(TCP/IP中的埠是16位的值)。因此,想象一下我們有一種方法來定義一個受限制的型別,我們可以用ValueError來消除
type ValidPort = { x :: Int | 1024 <= x <=65535 }
connect_to_next_port :: ValidPort -> ValidPort
connect_to_next_port = ...
但是我們可能找不到一個可以回傳的埠。我們沒有引發一個例外,而是回傳Maybe ValidPort型別的東西,你可以把它看作是一個包裝器,它包括ValidPort型別的值和None的值(在Haskell中它大致相當于Nothing)。
type ValidPort = { x :: Int | 1024 <= x <=65535 }
connect_to_next_port :: ValidPort -> Maybe ValidPort
connect_to_next_port = ...
所有這些要說的是,我們記錄的是可以被編碼為回傳型別的例外,而不是那些可以用適當的引數型別來消除的例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/320027.html
標籤:
