在python中引发异常的正确方法?

时间:2012-10-24 15:58:51

标签: python exception

以下是简单的代码:

import sys

class EmptyArgs(StandardError):
    pass

if __name__ == "__main__":
    #first way to raise exception
    if len(sys.argv) == 1:
       raise EmptyArgs     
    #second way to raise exception
    if len(sys.argv) == 1:
       raise EmptyArgs()

哪种方式“更”正确?两者都有效。
注意:在我的实际代码中,异常与我声明的完全相同:没有消息和参数。

3 个答案:

答案 0 :(得分:26)

两者都是正确的;后一种形式让你为你的例外附加参数:

if len(sys.argv) == 1:
   raise EmptyArgs('Specify at least 1 argument')

您还可以将参数作为第二个值传递给raise语句中的元组:

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',)

但是单个非元组值也可以工作,并且被视为单个参数:

if len(sys.argv) == 1:
   raise EmptyArgs, 'Specify at least 1 argument'

raise的第三个值让你指定一个备用回溯,然后使用它而不是为代码中的当前位置生成的回溯:

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',), traceback_object

请参阅raise statement

的文档

请注意,当您为异常使用参数时,The Python styleguide PEP 8更喜欢您提供异常实例,而不是类:

  

提出异常时,请使用raise ValueError('message')代替旧格式raise ValueError, 'message'

     

首选paren-using表单,因为当异常参数很长或包含字符串格式时,由于包含括号,您不需要使用行继续符。旧的表单将在Python 3中删除。

Python 3将不再支持该表单。

答案 1 :(得分:3)

NOT 建议在没有参数的情况下引发Exception,即提升异常类是不可取的。做这样的事情

raise MyException()

因为在Python 3.0中已经删除了类似的案例

raise Exception, "foo"
  

应该有一个 - 最好只有一个 - 显而易见的方法。

答案 2 :(得分:1)

这两种形式是等价的;他们最终都抛出EmptyArgs的实例。来自the documentation

  

如果第一个对象是一个类,它将成为异常的类型。第二个对象用于确定异常值:如果它是类的实例,则实例将成为异常值。如果第二个对象是元组,则将其用作类构造函数的参数列表;如果为None,则使用空参数列表,并将任何其他对象视为构造函数的单个参数。通过调用构造函数创建的实例用作异常值。

上面提到的“第二个对象”是raise的(可选)第二个参数:

raise EmptyArgs, 'Invalid input!'