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

Ant*_*al' 19 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()
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 27

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

if len(sys.argv) == 1:
   raise EmptyArgs('Specify at least 1 argument')
Run Code Online (Sandbox Code Playgroud)

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

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',)
Run Code Online (Sandbox Code Playgroud)

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

if len(sys.argv) == 1:
   raise EmptyArgs, 'Specify at least 1 argument'
Run Code Online (Sandbox Code Playgroud)

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

if len(sys.argv) == 1:
   raise EmptyArgs, ('Specify at least 1 argument',), traceback_object
Run Code Online (Sandbox Code Playgroud)

请参阅该语句的文档raise

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

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

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

Python 3将不再支持该表单.

  • 我想补充一点,在Python 3.0中,支持提升元组,例如`raise EmptyArgs,"text"`[已被删除](http://www.python.org/dev/peps/pep-3109/). (3认同)
  • @AnuragUniyal:但它并不明确.它的意思不会改变.`raise ExceptionClass`和`raise ExceptionClass()`是等价的. (2认同)