Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 容器类是处理错误还是仅仅引发错误?_Python_Error Handling - Fatal编程技术网

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

我正在用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 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
    /
    语句捕获内部列表引发的
    索引器,然后使用修改后的索引重试(尽管仔细想想,您可能会无条件地修改索引)


  • 因此,我认为没有一个正确答案。细节取决于你的收藏行为应该如何运作,以及它与你正在包装的列表有什么不同。

    好的,很好,这就是我开始思考的问题