【问题标题】:How active exception to reraise in Python(3.8<=)?在 Python(3.8<=) 中重新引发的异常活跃度如何?
【发布时间】:2021-11-24 03:52:26
【问题描述】:

看看这个:

RuntimeError: No active exception to reraise

我使用raise。没有这样的错误:

class example:
    def __getattribute__(self, attr_name):
        raise  # I mean: AttributeError: '...' object has no attribute '...'

这是raise statement

raise_stmt ::=  "raise" [expression ["from" expression]]

表达式是可选的。

我查看this,但这不是我的答案。如果错误显示“没有要重新引发的活动异常”,那么我可以激活错误。我不知道这个错误是什么意思。我的问题是,“主动异常”是什么意思,在哪里使用?它是否有助于使代码更短、更优化?是否可以将它用于我在代码中显示的稍高一点的任务?

【问题讨论】:

  • 这能回答你的问题吗? raise with no argument
  • 这是一个很接近的问题,但我的问题还有其他目的
  • 你能澄清你的问题吗?一个裸露的raise"re-raises the last exception that was active in the current scope"。您的代码中没有任何活动异常,这正是错误所说的。
  • 我需要属性AttributeError: '...' object has no attribute '...'的默认错误
  • 不存在默认错误。你提到的AttributeError 是由一些代码主动提出的——如果你不调用它,Python 无法知道你指的是哪个错误。

标签: python python-3.x exception


【解决方案1】:

我可以为我的问题找到这个:

“主动异常”是什么意思,用在什么地方?

然后使用try-except 和代码转到except 块,错误活动。 关于使用我们可以检查错误,如果不应该处理,可以使用 raise 不带 arg(即使在函数中)。现在没有引发错误 参考线。我不知道是否有其他方法可以做到这一点,但我对这种方法深信不疑。

例子:

>>> try:
...     10 / 0
... except[ ZeroDivisionError[ as err]]:
...     raise
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
>>> def test():
...     raise
... 
>>> try:
...     10 / 0
... except[ ZeroDivisionError[ as err]]:
...     test()
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
>>> 

它是否有助于使代码更短和更优化?

是的。通过使用这种方法,代码和错误被缩短了。但是在这种方法中,对异常过程的控制较少,有时会出现问题。

是否可以将它用于我在代码中显示的稍高一点的任务?

没有。必须返回NotImplemented 才能使上述代码生效。我对此充满信心,但有可能仅此还不够。

【讨论】:

    【解决方案2】:

    当你勉强使用raise关键字时,Python会尝试在当前范围内重新引发当前发生的异常,如果没有触发异常,你会得到RuntimeError: No active exception to re-raise

    要查看哪个异常处于活动状态(正在处理),您可以使用sys.exc_info()

    import sys
    
    try:
        raise ZeroDivisionError()
    except ZeroDivisionError:
        type_, value, tb = sys.exc_info()
        print(type_)  # <class 'ZeroDivisionError'>
    

    在上面的 except 块中,您可以使用裸 raise 关键字,它为您重新引发了 ZeroDivisionError 异常。

    如果没有活动异常,sys.exc_info() 的返回值为(None, None, None)。所以你必须使用raise 关键字,后跟BaseException 的子类或实例。在__getattribute__ 方法中的问题就是这种情况,因为没有活动异常。

    class Example:
        def __getattribute__(self, attr_name):
            raise AttributeError(f'Error for "{attr_name}".')
    
    obj  = Example()
    obj.foo   # AttributeError: Error for "foo".
    

    来自 cmets:

    活动异常表示当前触发的异常,并且在工作流中,如果你不捕捉它并让它冒泡,它将终止进程。

    【讨论】:

    • 我会稍微澄清一下,但我的问题是这会如何变化以及如何使用它
    • @Delta 正如我在答案中所说,您可以使用 raise 关键字,后跟您打算提出的异常。喜欢:raise AttributeError("'...' object has no attribute '...'").
    • 我的问题是:what is meant by "active exception" and where it is used? Does it help make the code shorter and more optimized? Is it possible to use it for the task I showed a little higher in the code? 这是第一个的答案。其他人呢?
    • @Delta 检查更新的答案,现在我想我已经回答了您关于裸 raise 关键字的作用以及何时/何地可以使用它的问题。
    • 我认为我的问题没有正确提出。我想使用raise 而不定义我的问题的异常并且可以使用这种方法。很抱歉,感谢您的回答和时间。
    猜你喜欢
    • 2021-10-04
    • 2023-03-21
    • 1970-01-01
    • 2016-03-18
    • 2011-09-12
    • 2018-12-14
    • 2023-03-31
    • 2013-02-05
    • 2020-07-14
    相关资源
    最近更新 更多