Home > database >  How active exception to reraise in Python(3.8<=)?
How active exception to reraise in Python(3.8<=)?

Time:10-04

look at this:

RuntimeError: No active exception to reraise

I use raise. with out error like this:

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

This is raise statement:

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

expression is OPTIONAL.

I check this, but this isn't my answer. if error says "No active exception to reraise", so I can active an error. I do not know what this error means. My question is, 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?

CodePudding user response:

When you use raise keyword barely, Python tries to re-raise the currently occurred exception in the current scope, If there is no exception triggered on, you will get RuntimeError: No active exception to re-raise.

To see which exception is active(being handled), you can use sys.exc_info():

import sys

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

In the above except block you can use bare raise keyword, which re-raised the ZeroDivisionError exception for you.

If there is no active exception, the returned value of sys.exc_info() is (None, None, None). So you have to use raise keyword followed by a subclass or an instance of BaseException. This is the case in your question inside __getattribute__ method since there is no active exception.

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

obj  = Example()
obj.foo   # AttributeError: Error for "foo".

From comments:

Active exception means the exception that is currently triggered on, and is in the workflow, If you don't catch it and let it bubbles up, it will terminate the process.

CodePudding user response:

I can find this for my questions:

what is meant by "active exception" and where it is used?

then using try-except and code goes to except block, error actives. about usage we can check error and if Should not be handled, can use raise without arg (Even In Functions). now error raised without Reference to line. I do not know if there is another way to do this or not, but I was convinced of this method.

Example:

>>> 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
>>> 

Does it help make the code shorter and more optimized?

Yes. By using this method, the code and error are shortened. But in this method, there is less control over the exception procedure, which can sometimes be problematic.

Is it possible to use it for the task I showed a little higher in the code?

No. NotImplemented must be returned for the above code to take effect. I have full confidence in this, but there is a possibility that this alone is not enough.

  • Related