标准的Python异常列表在哪里?
有一个列表是标准的Python异常,我们需要注意这些异常,但我觉得这些并不是我们自己应该抛出的,因为它们很少适用。
我很好奇在标准的Python库中,是否存在类似于.NET的ApplicationException、ArgumentNullException、ArgumentOutOfRangeException、InvalidOperationException这些异常的列表——也就是说,我们可以自己抛出的异常?
或者有没有其他更符合Python风格的方式来处理常见的错误情况,而不是抛出标准异常呢?
编辑:我并不是在询问如何处理异常,而是想知道在需要的地方我可以和应该抛出哪些类型的异常。
4 个回答
我记得在文档里学到,抛出预定义的异常是可以的,只要它们是合适的。例如,现在推荐的结束程序的方法不是直接调用 exit(),而是抛出 SystemExit。
另一个例子是可以在自定义容器类型中重用 IndexError 这个异常。
当然,你的应用程序应该定义自己的异常,而不是直接使用系统的异常。我只是想说,在合适的情况下,重用这些异常是没有问题的。
首先,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
这就是为你的应用程序创造一些独特而特别的东西所需要的全部。
如果错误的情况符合某个标准的 Python 异常类的描述,那就可以直接抛出这个异常。
常用的异常有 TypeError
和 ValueError
,你提到的那个列表已经是标准的异常列表了。
如果你想要一些特定于应用程序的异常,那就可以通过创建一个新的类,继承自 Exception 或它的子类来实现。
关于你提到的 .NET 的例子,ApplicationException
最接近 RuntimeError
,ArgumentNullException
可能对应的是 AttributeError
(你可以尝试调用你想要的方法,让 Python 自己抛出异常,这就是鸭子类型的用法)。AttributeOutOfRange
其实就是一个更具体的 ValueError
,而 InvalidOperationException
则可能对应 Python 标准库中的多个异常。
总之,选择一个能够反映你要抛出的错误的异常,参考一下 http://docs.python.org/library/exceptions.html 页面上的描述就可以了。