以下是简单的代码:
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()
哪种方式“更”正确?两者都有效。
注意:在我的实际代码中,异常与我声明的完全相同:没有消息和参数。
答案 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
的文档
请注意,当您为异常使用参数时,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!'