Python,提出没有参数的异常

时间:2010-07-12 12:43:57

标签: python exception arguments raise

我想知道关于在没有参数的情况下引发异常的最佳实践。 在官方python文档中,您可以看到:

try:
    raise KeyboardInterrupt

http://docs.python.org/tutorial/errors.html第8.6章)

在某些不同的代码中,比如Django或Google代码,您可以看到:

  def AuthenticateAndRun(self, username, password, args):
    raise NotImplementedError()

http://code.google.com/p/neatx/source/browse/trunk/neatx/lib/auth.py

异常是在没有参数的情况下被提升之前发生的异常。 没有参数实例化异常的目的是什么?当我应该使用第一种情况或第二种情况时?

提前致谢 法比安

3 个答案:

答案 0 :(得分:4)

您可以使用您喜欢的任何形式。没有真正的区别,并且在Python 2和3中都是合法的。Python style guide没有指定推荐哪一个。


关于“课堂形式”支持的更多信息:

try:
    raise KeyboardInterrupt

这种形式在Python 2和3中都是完全合法的。 摘录自pep-3109

  

raise EXCEPTION用于引发新的异常。这个表格有两个   子变体:EXCEPTION可以是异常类或实例   例外类;有效的异常类是BaseException及其   子类[5]。 如果EXCEPTION是子类,则将使用no调用它   获取异常实例的参数。

Python documentation

中也对此进行了描述
  

...如果是类,则在需要时将获取异常实例   通过实例化没有参数的类。

答案 1 :(得分:3)

不推荐使用异常类而不是异常实例语法,不应在新代码中使用。

raise Exception, "This is not how to raise an exception..."

答案 2 :(得分:0)

在像C ++这样的语言中,您可以引发任何对象,而不仅仅是异常。 Python更受限制。如果您尝试:

raise 1

你得到:

Traceback (most recent call last):
...
TypeError: exceptions must be old-style classes or derived from BaseException, not int

在python编程模型中,您通常可以使用一个类而不是一个实例(这对于快速创建唯一实例很方便,只需定义一个类)。因此,难怪您可以引发异常类而不是异常实例。

然而就像伊格纳西奥所说,这已被弃用。

另外,一些侧面说明不是直接的问题:

您还可以在某些代码中单独看到单独提升。没有任何对象类或任何东西。它在异常处理程序中用于重新引发当前异常并保持初始回溯。