CINXE.COM
PEP 415 – Implement context suppression with exception attributes | peps.python.org
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="color-scheme" content="light dark"> <title>PEP 415 – Implement context suppression with exception attributes | peps.python.org</title> <link rel="shortcut icon" href="../_static/py.png"> <link rel="canonical" href="https://peps.python.org/pep-0415/"> <link rel="stylesheet" href="../_static/style.css" type="text/css"> <link rel="stylesheet" href="../_static/mq.css" type="text/css"> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light"> <link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark"> <link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss"> <meta property="og:title" content='PEP 415 – Implement context suppression with exception attributes | peps.python.org'> <meta property="og:description" content="PEP 409 introduced support for the raise exc from None construct to allow the display of the exception context to be explicitly suppressed. This PEP retains the language level changes already implemented in PEP 409, but replaces the underlying implement..."> <meta property="og:type" content="website"> <meta property="og:url" content="https://peps.python.org/pep-0415/"> <meta property="og:site_name" content="Python Enhancement Proposals (PEPs)"> <meta property="og:image" content="https://peps.python.org/_static/og-image.png"> <meta property="og:image:alt" content="Python PEPs"> <meta property="og:image:width" content="200"> <meta property="og:image:height" content="200"> <meta name="description" content="PEP 409 introduced support for the raise exc from None construct to allow the display of the exception context to be explicitly suppressed. This PEP retains the language level changes already implemented in PEP 409, but replaces the underlying implement..."> <meta name="theme-color" content="#3776ab"> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all"> <title>Following system colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="9"></circle> <path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path> </svg> </symbol> <symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all"> <title>Selected dark colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path> </svg> </symbol> <symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all"> <title>Selected light colour scheme</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line> <line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line> <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> </symbol> </svg> <script> document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto" </script> <section id="pep-page-section"> <header> <h1>Python Enhancement Proposals</h1> <ul class="breadcrumbs"> <li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> » </li> <li><a href="../pep-0000/">PEP Index</a> » </li> <li>PEP 415</li> </ul> <button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())"> <svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg> <svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg> <span class="visually-hidden">Toggle light / dark / auto colour theme</span> </button> </header> <article> <section id="pep-content"> <h1 class="page-title">PEP 415 – Implement context suppression with exception attributes</h1> <dl class="rfc2822 field-list simple"> <dt class="field-odd">Author<span class="colon">:</span></dt> <dd class="field-odd">Benjamin Peterson <benjamin at python.org></dd> <dt class="field-even">BDFL-Delegate<span class="colon">:</span></dt> <dd class="field-even">Alyssa Coghlan</dd> <dt class="field-odd">Status<span class="colon">:</span></dt> <dd class="field-odd"><abbr title="Accepted and implementation complete, or no longer active">Final</abbr></dd> <dt class="field-even">Type<span class="colon">:</span></dt> <dd class="field-even"><abbr title="Normative PEP with a new feature for Python, implementation change for CPython or interoperability standard for the ecosystem">Standards Track</abbr></dd> <dt class="field-odd">Created<span class="colon">:</span></dt> <dd class="field-odd">26-Feb-2012</dd> <dt class="field-even">Python-Version<span class="colon">:</span></dt> <dd class="field-even">3.3</dd> <dt class="field-odd">Post-History<span class="colon">:</span></dt> <dd class="field-odd">26-Feb-2012</dd> <dt class="field-even">Replaces<span class="colon">:</span></dt> <dd class="field-even"><a class="reference external" href="../pep-0409/">409</a></dd> <dt class="field-odd">Resolution<span class="colon">:</span></dt> <dd class="field-odd"><a class="reference external" href="https://mail.python.org/pipermail/python-dev/2012-May/119467.html">Python-Dev message</a></dd> </dl> <hr class="docutils" /> <section id="contents"> <details><summary>Table of Contents</summary><ul class="simple"> <li><a class="reference internal" href="#abstract">Abstract</a></li> <li><a class="reference internal" href="#pep-acceptance">PEP Acceptance</a></li> <li><a class="reference internal" href="#rationale">Rationale</a></li> <li><a class="reference internal" href="#proposal">Proposal</a></li> <li><a class="reference internal" href="#patches">Patches</a></li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> </details></section> <section id="abstract"> <h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2> <p><a class="pep reference internal" href="../pep-0409/" title="PEP 409 – Suppressing exception context">PEP 409</a> introduced support for the <code class="docutils literal notranslate"><span class="pre">raise</span> <span class="pre">exc</span> <span class="pre">from</span> <span class="pre">None</span></code> construct to allow the display of the exception context to be explicitly suppressed. This PEP retains the language level changes already implemented in <a class="pep reference internal" href="../pep-0409/" title="PEP 409 – Suppressing exception context">PEP 409</a>, but replaces the underlying implementation mechanism with a simpler approach based on a new <code class="docutils literal notranslate"><span class="pre">__suppress_context__</span></code> attribute on all <code class="docutils literal notranslate"><span class="pre">BaseException</span></code> instances.</p> </section> <section id="pep-acceptance"> <h2><a class="toc-backref" href="#pep-acceptance" role="doc-backlink">PEP Acceptance</a></h2> <p>This PEP was accepted by Alyssa Coghlan on the 14th of May, 2012.</p> </section> <section id="rationale"> <h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2> <p><a class="pep reference internal" href="../pep-0409/" title="PEP 409 – Suppressing exception context">PEP 409</a> changes <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> to be <code class="docutils literal notranslate"><span class="pre">Ellipsis</span></code> by default. Then if <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> is set to <code class="docutils literal notranslate"><span class="pre">None</span></code> by <code class="docutils literal notranslate"><span class="pre">raise</span> <span class="pre">exc</span> <span class="pre">from</span> <span class="pre">None</span></code>, no context or cause will be printed should the exception be uncaught.</p> <p>The main problem with this scheme is it complicates the role of <code class="docutils literal notranslate"><span class="pre">__cause__</span></code>. <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> should indicate the cause of the exception not whether <code class="docutils literal notranslate"><span class="pre">__context__</span></code> should be printed or not. This use of <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> is also not easily extended in the future. For example, we may someday want to allow the programmer to select which of <code class="docutils literal notranslate"><span class="pre">__context__</span></code> and <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> will be printed. The <a class="pep reference internal" href="../pep-0409/" title="PEP 409 – Suppressing exception context">PEP 409</a> implementation is not amenable to this.</p> <p>The use of <code class="docutils literal notranslate"><span class="pre">Ellipsis</span></code> is a hack. Before <a class="pep reference internal" href="../pep-0409/" title="PEP 409 – Suppressing exception context">PEP 409</a>, <code class="docutils literal notranslate"><span class="pre">Ellipsis</span></code> was used exclusively in extended slicing. Extended slicing has nothing to do with exceptions, so it’s not clear to someone inspecting an exception object why <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> should be set to <code class="docutils literal notranslate"><span class="pre">Ellipsis</span></code>. Using <code class="docutils literal notranslate"><span class="pre">Ellipsis</span></code> by default for <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> makes it asymmetrical with <code class="docutils literal notranslate"><span class="pre">__context__</span></code>.</p> </section> <section id="proposal"> <h2><a class="toc-backref" href="#proposal" role="doc-backlink">Proposal</a></h2> <p>A new attribute on <code class="docutils literal notranslate"><span class="pre">BaseException</span></code>, <code class="docutils literal notranslate"><span class="pre">__suppress_context__</span></code>, will be introduced. Whenever <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> is set, <code class="docutils literal notranslate"><span class="pre">__suppress_context__</span></code> will be set to <code class="docutils literal notranslate"><span class="pre">True</span></code>. In particular, <code class="docutils literal notranslate"><span class="pre">raise</span> <span class="pre">exc</span> <span class="pre">from</span> <span class="pre">cause</span></code> syntax will set <code class="docutils literal notranslate"><span class="pre">exc.__suppress_context__</span></code> to <code class="docutils literal notranslate"><span class="pre">True</span></code>. Exception printing code will check for that attribute to determine whether context and cause will be printed. <code class="docutils literal notranslate"><span class="pre">__cause__</span></code> will return to its original purpose and values.</p> <p>There is precedence for <code class="docutils literal notranslate"><span class="pre">__suppress_context__</span></code> with the <code class="docutils literal notranslate"><span class="pre">print_line_and_file</span></code> exception attribute.</p> <p>To summarize, <code class="docutils literal notranslate"><span class="pre">raise</span> <span class="pre">exc</span> <span class="pre">from</span> <span class="pre">cause</span></code> will be equivalent to:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">exc</span><span class="o">.</span><span class="n">__cause__</span> <span class="o">=</span> <span class="n">cause</span> <span class="k">raise</span> <span class="n">exc</span> </pre></div> </div> <p>where <code class="docutils literal notranslate"><span class="pre">exc.__cause__</span> <span class="pre">=</span> <span class="pre">cause</span></code> implicitly sets <code class="docutils literal notranslate"><span class="pre">exc.__suppress_context__</span></code>.</p> </section> <section id="patches"> <h2><a class="toc-backref" href="#patches" role="doc-backlink">Patches</a></h2> <p>There is a patch on <a class="reference external" href="http://bugs.python.org/issue14133">Issue 14133</a>.</p> </section> <section id="copyright"> <h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2> <p>This document has been placed in the public domain.</p> </section> </section> <hr class="docutils" /> <p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0415.rst">https://github.com/python/peps/blob/main/peps/pep-0415.rst</a></p> <p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0415.rst">2023-10-11 12:05:51 GMT</a></p> </article> <nav id="pep-sidebar"> <h2>Contents</h2> <ul> <li><a class="reference internal" href="#abstract">Abstract</a></li> <li><a class="reference internal" href="#pep-acceptance">PEP Acceptance</a></li> <li><a class="reference internal" href="#rationale">Rationale</a></li> <li><a class="reference internal" href="#proposal">Proposal</a></li> <li><a class="reference internal" href="#patches">Patches</a></li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> <br> <a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0415.rst">Page Source (GitHub)</a> </nav> </section> <script src="../_static/colour_scheme.js"></script> <script src="../_static/wrap_tables.js"></script> <script src="../_static/sticky_banner.js"></script> </body> </html>