【问题标题】:Python, rasing an exception without argumentsPython,引发不带参数的异常
【发布时间】:2011-03-14 19:17:02
【问题描述】:

我想知道在没有参数的情况下引发异常的最佳实践。 在官方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)

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

提前致谢 法比恩

【问题讨论】:

    标签: python exception arguments raise


    【解决方案1】:

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


    关于“类表单”支持的更多信息:

    try:
        raise KeyboardInterrupt
    

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

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

    Python documentation中也有描述:

    ...如果是类,需要的时候会获取异常实例 通过实例化不带参数的类。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 对于那些好奇的人,请参阅python.org/dev/peps/pep-0352/#transition-plan 了解有关异常相关弃用的更多信息。
      • 我无法弄清楚您推荐的是什么。您的代码示例似乎是 not 要做的。也许你应该展示应该做什么。
      【解决方案3】:

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

      raise 1
      

      你得到:

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

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

      不过,就像 Ignacio 所说,这已被弃用。

      另外,一些不是直接问题的旁注:

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

      【讨论】:

        猜你喜欢
        • 2012-02-20
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多