Message177197
| Author |
ncoghlan |
| Recipients |
Arfrever, Tyler.Crompton, ethan.furman, georg.brandl, ncoghlan, python-dev |
| Date |
2012年12月09日.06:24:11 |
| SpamBayes Score |
-1.0 |
| Marked as misclassified |
Yes |
| Message-id |
<CADiSq7f16vnyCzw82bCMeQK=D9Zj0+Ntk7C8_4brAbiMQcyDbA@mail.gmail.com> |
| In-reply-to |
<1354985956.6.0.815394333998.issue15209@psf.upfronthosting.co.za> |
| Content |
On Sun, Dec 9, 2012 at 2:59 AM, Ethan Furman <report@bugs.python.org> wrote:
>
> Ethan Furman added the comment:
>
> There is one typo and one error in the first paragraph of the patch:
>
> > When raising a new exception (rather than
> > using to bare ``raise`` to re-raise the
> ^ should be an 'a'
>
Fixed.
> > Setting :attr:`__cause__` also implicitly sets
> > the :attr:`__suppress_context__` attribute to ``True``.
>
> The last sentence is incorrect -- __suppress_context__ is only set to True
> if __cause__ is set to None; if __cause__ is set to any other exception
> __suppress_context__ remains False and the new exception chain will be
> printed:
>
> >>> try:
> ... raise ValueError
> ... except:
> ... raise NameError from KeyError
> ...
> KeyError
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
> File "<stdin>", line 4, in <module>
> NameError
>
Not true: __suppress_context__ is always set as a side effect of setting
__cause__ (it's built into the setter for the __cause__ descriptor). What
you're seeing in the traceback above is the explicit cause, not the
implicit context.
>>> e = Exception()
>>> e.__cause__ = Exception()
>>> e.__suppress_context__
True
The only mechanism we offer to suppress an explicit __cause__ is setting
__cause__ to None.
Cheers,
Nick. |
|