Python 容器类是处理错误还是仅仅引发错误?
我正在用Python创建一个伪Python 容器类是处理错误还是仅仅引发错误?,python,error-handling,Python,Error Handling,我正在用Python创建一个伪Vector类,我想知道我是否应该进行错误检查,如果应该,检查到什么程度 例如,当某人执行以下操作时: vec = Vector(1,2,3,4) # vec is now [1,2,3,4] vec[100] = 12 我的\uuuu setitem\uuuu生成的索引器会发生什么情况?我的\uuuu setitem\uuuu是否应包含: if index < 0 or index >= len(self.vector): raise Ind
Vector
类,我想知道我是否应该进行错误检查,如果应该,检查到什么程度
例如,当某人执行以下操作时:
vec = Vector(1,2,3,4)
# vec is now [1,2,3,4]
vec[100] = 12
我的\uuuu setitem\uuuu
生成的索引器会发生什么情况?我的\uuuu setitem\uuuu
是否应包含:
if index < 0 or index >= len(self.vector):
raise IndexError("Index out of bounds")
如果索引<0或索引>=len(自向量):
提升索引器(“索引超出范围”)
还是应该如此
try:
if index < 0 or index >= len(self.vector):
raise IndexError("Index out of bounds")
except IndexError as e:
print(str(e))
试试看:
如果索引<0或索引>=len(自向量):
提升索引器(“索引超出范围”)
除索引器e外:
打印(str(e))
通常情况下,是容器类的用户将处理错误,还是容器本身应该知道如何处理错误?如果容器将通过处理错误来消除错误,那么您永远不会发现错误地使用向量的代码有问题
换句话说,如果将索引赋值为越界是正确的行为,并且是容器预期设计的一部分,则只处理Vector
类中的异常
对于绝大多数用例,您的类不应该处理索引器
;试图将一个索引分配到界外是一个无效的用例。< P>我认为当您的自定义类包装一些其他类时,有两个场景需要考虑(例如,在“代码>列表”之上构建的自定义容器类)。
包装类和包装器对有效输入都有相同的期望,并且应该在无效输入上引发相同的异常。在这种情况下,您不需要处理异常,因为内部包装类将引发的异常是合适的。处理此类异常的唯一可能原因是隐藏类的内部工作(在这种情况下,您可能希望在异常处理程序中从无引发SomeException
,以隐藏内部细节)
包装器的行为应该与包装的类不同。在这种情况下,您可能需要提前检查和/或修改输入,或者捕获并抑制由包装代码引发的异常。例如,列表允许负索引,如果不希望容器这样做,则需要检查传入的索引是否为负(如果为负,则引发indexer
)。或者,如果您希望允许边界外索引不受限制地环绕(这样任何索引i
都被视为i%len(self.vector)
),您可以使用try
/语句捕获内部列表引发的索引器,然后使用修改后的索引重试(尽管仔细想想,您可能会无条件地修改索引)
因此,我认为没有一个正确答案。细节取决于你的收藏行为应该如何运作,以及它与你正在包装的列表有什么不同。好的,很好,这就是我开始思考的问题