21

这是简单的代码:

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()

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

4

3 回答 3

30

两者都是正确的;后一种形式让您将参数附加到您的异常:

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声明的文档

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

引发异常时,请使用raise ValueError('message')而不是旧形式raise ValueError, 'message'

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

Python 3 将不再支持这种形式。

于 2012-10-24T16:00:09.537 回答
2

不建议在没有参数的情况下引发异常,即引发异常类不是要走的路。做这样的事情

raise MyException()

因为在 Python 3.0 中,类似的情况已被永久删除

raise Exception, "foo"

应该有一种——最好只有一种——明显的方法来做到这一点。

于 2012-10-24T16:09:04.123 回答
1

这两种形式是等价的;他们最终都抛出了一个EmptyArgs. 从文档中

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

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

raise EmptyArgs, 'Invalid input!'
于 2012-10-24T16:00:23.077 回答