2015-09-06 43 views
1

我正在努力在Python中創建一個僞Vector類,我想知道如果我應該錯誤檢查,如果是的話,在多大程度上。容器類是處理錯誤還是僅僅提高它們?

例如,當它下面的人:

vec = Vector(1,2,3,4) 
# vec is now [1,2,3,4] 
vec[100] = 12 

應與IndexError發生什麼由我__setitem__產生的?如果我__setitem__包含:

if index < 0 or index >= len(self.vector): 
    raise IndexError("Index out of bounds") 

還是應

try: 
    if index < 0 or index >= len(self.vector): 
     raise IndexError("Index out of bounds") 
except IndexError as e: 
    print(str(e)) 

是一般的情況下,一個容器類的用戶將處理錯誤,還是應該容器本身知道處理錯誤?

回答

1

我認爲有兩種情況,當您的自定義類包裝一些其他類(如內置於list的頂部自定義容器類)來考慮。

  1. 包裝類和包裝器對於有效輸入都具有相同的期望值,並且應該在無效值上引發相同的異常。在這種情況下,你不需要處理異常,因爲內部包裝類將會引發這個異常。你可能想要處理這種異常的唯一可能原因是隱藏你的類的內部工作(在這種情況下,你可能想在異常處理程序中使用raise SomeException from None來隱藏內部細節)。

  2. 的包裝應具有不同的行爲被包裝類。在這種情況下,您可能需要提前檢查和/或修改輸入,或者捕獲並抑制包裝代碼引發的異常。例如,列表允許負面索引,如果你不想你的容器這樣做,你將需要檢查傳入的索引是否定的(如果它們是IndexError)。或者,如果您希望允許超出範圍索引而無限制地進行環繞(以便將任何索引i視爲i % len(self.vector)),則可以使用try/except語句捕獲由內部列表引發的IndexError,並使用修改索引(儘管想起它,你可能會無條件地修改索引)。

所以,我不認爲有一個單一的正確答案。細節取決於你的集合的行爲應該如何工作,以及與你打包的列表有何不同。

1

如果你的容器會沉默的錯誤(通過處理它們)使用Vector不當你永遠不會找到代碼的問題。

換句話說,如果分配給索引越界是正確的行爲和您的容器的預期設計的一部分,只處理Vector類的異常。

對於絕大多數的使用情況,您的類不應該處理IndexError;試圖分配給索引超出範圍是一個無效的用例。

+0

好吧,那就是我開始想的 –

相關問題