Mark Dickinson <dicki...@gmail.com> added the comment:

Ram: I think you're conflating two separate things, here:

(1) The ability to use an exception *class* instead of an exception *instance* 
in the "from" clause - that is, the ability to do "raise ValueError from 
TypeError" in place of "raise ValueError from TypeError()"

(2) The lack of a traceback from the local exception-handling context when 
doing raise from.

The two are independent: you'll see the same lack of traceback that you 
described if you do "raise ValueError from TypeError()" instead of "raise 
ValueError from TypeError".

Both behaviours are by design (as Steven already pointed out for (2)). However, 
on point (1), there may be a documentation bug here. The reference manual, 
under 
https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement, says:

> The from clause is used for exception chaining: if given, the second 
> expression must be another exception class or instance, which will then be 
> attached to the raised exception as the __cause__ attribute (which is 
> writable).

However, this description appears not to match the implementation. In the case 
that the second expression is an exception class, it's *not* attached to the 
raised exception as the __cause__ attribute. Instead, the exception class is 
first instantiated, and then the resulting exception *instance* is attached to 
the raised exception as the __cause__ attribute.

The corresponding part of the implementation is here: 
https://github.com/python/cpython/blob/b745a6143ae79efe00aa46affe5ea31a06b0b532/Python/ceval.c#L4758-L4763

Demonstration:

    >>> try:
    ...     raise ZeroDivisionError() from RuntimeError
    ... except Exception as e:
    ...     exc = e
    ... 
    >>> exc.__cause__
    RuntimeError()
    >>> exc.__cause__ is RuntimeError  # reference manual would suggest this is 
True
    False
    >>> isinstance(exc.__cause__, RuntimeError)  # actual behaviour
    True

----------
nosy: +mark.dickinson

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue43002>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to