标准的Python异常列表在哪里?

18 投票
4 回答
12568 浏览
提问于 2025-04-16 06:33

有一个列表是标准的Python异常,我们需要注意这些异常,但我觉得这些并不是我们自己应该抛出的,因为它们很少适用。

我很好奇在标准的Python库中,是否存在类似于.NET的ApplicationExceptionArgumentNullExceptionArgumentOutOfRangeExceptionInvalidOperationException这些异常的列表——也就是说,我们可以自己抛出的异常?

或者有没有其他更符合Python风格的方式来处理常见的错误情况,而不是抛出标准异常呢?

编辑:我并不是在询问如何处理异常,而是想知道在需要的地方我可以和应该抛出哪些类型的异常。

4 个回答

5

我记得在文档里学到,抛出预定义的异常是可以的,只要它们是合适的。例如,现在推荐的结束程序的方法不是直接调用 exit(),而是抛出 SystemExit。

另一个例子是可以在自定义容器类型中重用 IndexError 这个异常。

当然,你的应用程序应该定义自己的异常,而不是直接使用系统的异常。我只是想说,在合适的情况下,重用这些异常是没有问题的。

14

首先,Python会自动为你处理常见的错误。

与其提前请求许可,不如事后请求原谅。

你只需要尝试去做某个操作,让Python自己来处理错误。不要用 if would_not_work(): raise Exception 把所有东西都包起来,这样做没什么意义。Python在所有情况下都会帮你处理这些。

如果你觉得需要自己抛出一个标准错误,那可能是你写的代码太多了。

有时候你可能需要抛出 ValueError

def someFunction( arg1 ):
    if arg1 <= 0.0:
        raise ValueError( "Guess Again." )

偶尔你可能会需要抛出 TypeError,但这种情况很少见。

def someFunctionWithConstraints( arg1 ):
    if isinstance(arg1,float):
         raise TypeError( "Can't work with float and can't convert to int, either" )
    etc.

其次,你几乎总是想要创建自己独特的错误类型。

 class MyException( Exception ): 
     pass

这就是为你的应用程序创造一些独特而特别的东西所需要的全部。

15

如果错误的情况符合某个标准的 Python 异常类的描述,那就可以直接抛出这个异常。

常用的异常有 TypeErrorValueError,你提到的那个列表已经是标准的异常列表了。

如果你想要一些特定于应用程序的异常,那就可以通过创建一个新的类,继承自 Exception 或它的子类来实现。

关于你提到的 .NET 的例子,ApplicationException 最接近 RuntimeErrorArgumentNullException 可能对应的是 AttributeError(你可以尝试调用你想要的方法,让 Python 自己抛出异常,这就是鸭子类型的用法)。AttributeOutOfRange 其实就是一个更具体的 ValueError,而 InvalidOperationException 则可能对应 Python 标准库中的多个异常。

总之,选择一个能够反映你要抛出的错误的异常,参考一下 http://docs.python.org/library/exceptions.html 页面上的描述就可以了。

撰写回答