程序要提升的标准python例外列表在哪里?

时间:2010-11-04 11:18:54

标签: python exception error-handling

我们应该注意一个列表standard python exceptions,但我不认为这些是我们应该提出的,因为它们很少适用。

我很好奇标准python库中是否存在列表,例外类似于.NET的ApplicationExceptionArgumentNullExceptionArgumentOutOfRangeExceptionInvalidOperationException - 我们的例外情况可以提高自己吗?

或者是否有不同的,更加pythonic的方式来处理常见错误情况,而不是提出标准异常?

编辑:我不是在询问如何处理异常,而是在可能的情况下我应该提出哪些类型。

4 个答案:

答案 0 :(得分:14)

如果错误与其中一个标准python异常类的描述匹配,那么一定要抛出它。

常用的是TypeErrorValueError,您链接的列表已经是标准列表。

如果你想拥有特定于应用程序的那些,那么继承子类化Exception或其中一个后代是可行的方法。

引用您从.NET提供的示例 ApplicationException最接近RuntimeError ArgumentNullException可能是AttributeError(尝试并调用您想要的方法,让python引发异常并输入) AttributeOutOfRange只是一个更具体的ValueError InvalidOperationException可以是python标准库中任意数量的大致相同的异常。

基本上,根据http://docs.python.org/library/exceptions.html页面中的说明选择一个反映您正在筹集的错误。

答案 1 :(得分:13)

首先,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

这就是为您的应用创造独特和独特的东西所需的一切。

答案 2 :(得分:5)

我似乎记得通过文档训练可以提出预定义的异常,只要它们是合适的。例如,推荐的终止方法不再是调用exit()而是调用SystemExit。

给出的另一个例子是在自定义容器类型上重用IndexError异常。

当然,您的应用程序应该定义自己的异常,而不是实际重新调整系统异常。我只是说禁止在适当的时候重复使用它们。

答案 3 :(得分:2)

Pythonic方式只是让异常从Python本身传递出去。例如,而不是:

def foo(arg):
  if arg is None:
    raise SomeNoneException
  bar = arg.param

只是做:

def foo(arg):
  bar = arg.param

如果argNone或者没有param属性,您将从Python本身获得异常。

在Python glossary中,这称为“EAFP”:

  

比获得许可更容易请求宽恕。这是常见的Python编码   风格假定存在有效   键或属性和捕获   如果假设证明有例外   假。这种干净,快速的风格是   特点是存在许多   尝试和除了陈述。该   技术与LBYL形成鲜明对比(Look Before You Leap)   许多其他语言共有的风格   例如C.

它与Python固有的鸭子打字理念配合使用。


这并不意味着你不应该创建自己的异常,当然,只是你不需要包装已经存在的Python异常。

对于您自己的例外,创建派生自Exception的类,并在适当的时候抛出它们。