[Python-checkins] r53638 - peps/trunk/pep-0000.txt peps/trunk/pep-3110.txt

collin.winter python-checkins at python.org
Mon Feb 5 23:05:47 CET 2007


Author: collin.winter
Date: Mon Feb  5 23:05:46 2007
New Revision: 53638

Added:
   peps/trunk/pep-3110.txt   (contents, props changed)
Modified:
   peps/trunk/pep-0000.txt
Log:
Add PEP 3110: Catching Exceptions in Python 3000

Modified: peps/trunk/pep-0000.txt
==============================================================================
--- peps/trunk/pep-0000.txt	(original)
+++ peps/trunk/pep-0000.txt	Mon Feb  5 23:05:46 2007
@@ -108,6 +108,7 @@
  S  3107  Function Annotations                         Winter, Lownds
  I  3108  Standard Library Reorganization              Cannon
  I  3109  Raising Exceptions in Python 3000            Winter
+ I  3110  Catching Exceptions in Python 3000           Winter
 
  Finished PEPs (done, implemented in Subversion)
 
@@ -449,6 +450,7 @@
  S  3107  Function Annotations                         Winter, Lownds
  I  3108  Standard Library Reorganization              Cannon
  I  3109  Raising Exceptions in Python 3000            Winter
+ I  3110  Catching Exceptions in Python 3000           Winter
 
 Key
 

Added: peps/trunk/pep-3110.txt
==============================================================================
--- (empty file)
+++ peps/trunk/pep-3110.txt	Mon Feb  5 23:05:46 2007
@@ -0,0 +1,287 @@
+PEP: 3110
+Title: Catching Exceptions in Python 3000
+Version: $Revision$
+Last-Modified: $Date$
+Author: Collin Winter <collinw at gmail.com>
+Status: Draft
+Type: Standards Track
+Content-Type: text/x-rst
+Created: 16-Jan-2006
+Python-Version: 3.0
+Post-History:
+
+
+Abstract
+========
+
+This PEP introduces changes intended to help eliminate ambiguities
+in Python's grammar, simplify exception classes, simplify garbage
+collection for exceptions and reduce the size of the language in
+Python 3.0.
+
+
+Rationale
+=========
+
+1. ``except`` clauses in Python 2.x present a syntactic ambiguity
+   where the parser cannot differentiate whether ::
+
+       except <expression>, <expression>:
+    
+   should be interpreted as ::
+
+       except <type>, <type>:
+    
+   or ::
+
+       except <type>, <name>:
+
+   Python 2 opts for the latter semantic, at the cost of requiring the
+   former to be parenthesized, like so ::
+
+    except (<type>, <type>):
+
+2. As specified in PEP 352 [#pep352]_, the ability to treat exceptions
+   as tuples will be removed, meaning this code will no longer work ::
+
+       except os.error, (errno, errstr):
+    
+   Because the automatic unpacking will no longer be possible, it is
+   desirable to remove the ability to use tuples as ``except`` targets.
+
+3. As specified in PEP 344 [#pep344]_, exception instances in Python 3
+   will possess a ``__traceback__`` attribute. The Open Issues section
+   of that PEP includes a paragraph on garbage collection difficulties
+   caused by this attribute, namely a "exception -> traceback ->
+   stack frame -> exception" reference cycle, whereby all locals are 
+   kept in scope until the next GC run. This PEP intends to resolve
+   this issue by adding a cleanup semantic to ``except`` clauses in
+   Python 3 whereby the target name is deleted at the end of the
+   ``except`` suite.
+   
+4. In the spirit of "there should be one -- and preferably only one
+   -- obvious way to do it" [#zen]_, it is desirable to consolidate
+   duplicate functionality. To this end, the ``exc_value``,
+   ``exc_type`` and ``exc_traceback`` attributes of the ``sys``
+   module [#sys-module]_ will be removed in favor of
+   ``sys.exc_info()``, which provides the same information. These
+   attributes are already listed in PEP 3100 [#pep3100]_ as targeted
+   for removal.
+
+
+Grammar Changes
+===============
+    
+In Python 3, the grammar for ``except`` statements will change
+from [#grammar]_ ::
+
+    except_clause: 'except' [test [',' test]]
+    
+to ::
+
+    except_clause: 'except' [test ['as' NAME]]
+
+The use of ``as`` in place of the comma token means that ::
+
+    except AttributeError, os.error:
+    
+can be clearly understood as a tuple of exception classes. This new
+syntax was first proposed by Greg Ewing [#firstproposal]_ and
+endorsed ([#firstproposal]_, [#renaming]_) by the BDFL.
+
+Further, the restriction of the token following ``as`` from ``test``
+to ``NAME`` means that only valid identifiers can be used as
+``except`` targets.
+
+
+Semantic Changes
+================
+
+In order to resolve the garbage collection issue related to PEP 344,
+``except`` statements in Python 3 will generate additional bytecode to
+delete the target, thus eliminating the reference cycle.
+The source-to-source translation, as suggested by Phillip J. Eby
+[#except-translation]_, is ::
+
+    try:
+        try_body
+    except E as N:
+        except_body
+    ...
+    
+gets translated to (in Python 2.5 terms) ::
+
+    try:
+        try_body
+    except E, N:
+        try:
+            except_body
+        finally:
+            N = None
+            del N
+    ...
+
+An implementation has already been checked into the p3yk branch
+[#translation-checkin]_.
+
+
+Compatibility Issues
+====================
+
+Nearly all ``except`` clauses will need to be changed. ``except``
+clauses with identifier targets will be converted from ::
+
+    except E, N:
+    
+to ::
+    
+    except E as N:
+
+``except`` clauses with non-tuple, non-identifier targets
+(e.g., ``a.b.c[d]``) will need to be converted from ::
+
+    except E, T:
+    
+to ::
+
+    except E as t:
+        T = t
+        
+Both of these cases can be handled by Guido van Rossum's ``2to3``
+utility [#2to3]_ using the ``except`` fixer [#exceptfixer]_.
+        
+``except`` clauses with tuple targets will need to be converted
+manually, on a case-by-case basis. These changes will usually need
+to be accompanied by changes to the exception classes themselves.
+While these changes generally cannot be automated, the ``2to3``
+utility is able to point out cases where the target of an ``except``
+clause is a tuple, simplifying conversion.
+
+Situations where it is necessary to keep an exception instance around
+past the end of the ``except`` suite can be easily translated like so
+::
+
+    try:
+        ...
+    except E as N:
+        ...
+    ...
+    
+becomes ::
+
+    try:
+        ...
+    except E as N:
+        n = N
+        ...
+    ...
+    
+This way, when ``N`` is deleted at the end of the block, ``n`` will
+persist and can be used as normal.
+
+Lastly, all uses of the ``sys`` module's ``exc_type``, ``exc_value``
+and ``exc_traceback`` attributes will need to be removed. They can be
+replaced with ``sys.exc_info()[0]``, ``sys.exc_info()[1]`` and
+``sys.exc_info()[2]`` respectively, a transformation that can be
+performed by ``2to3``'s ``sysexcattrs`` fixer.
+
+
+Open Issues
+===========
+
+"except" Statements in Python 2.x
+-----------------------------------
+
+It has been proposed that the grammar for ``except`` statements be
+changed to accommodate both Python 2's ``,`` and Python 3's ``as``
+between the statement's type and target portions. The grammar
+would thus change from ::
+
+    except_clause: 'except' [test [',' test]]
+
+to ::
+
+    except_clause: 'except' [test [('as' | ',') test]]
+
+It has not been decided whether the proposed end-of-suite cleanup
+semantic for ``except`` statements should be included in the 2.x
+series.
+
+
+Replacing or Dropping "sys.exc_info()"
+--------------------------------------
+
+The idea of dropping ``sys.exc_info()`` or replacing it with a
+``sys.exception`` attribute or a ``sys.get_exception()`` function
+has been raised several times on python-3000 ([#drop-excinfo]_,
+[#replace-excinfo]_) and mentioned in PEP 344's "Open Issues" section.
+
+While a ``2to3`` fixer to replace calls to ``sys.exc_info()``
+and some attribute accesses would be trivial, it would be far more
+difficult for static analysis to find and fix functions that expect
+the values from ``sys.exc_info()`` as arguments. Similarly, this does
+not address the need to rewrite the documentation for all APIs that
+are defined in terms of ``sys.exc_info()``.
+
+
+References
+==========
+
+.. [#pep352]
+   http://www.python.org/dev/peps/pep-0352/
+   
+.. [#zen]
+   http://www.python.org/dev/peps/pep-0020/
+   
+.. [#sys-module]
+   http://docs.python.org/lib/module-sys.html
+   
+.. [#pep3100]
+   http://www.python.org/dev/peps/pep-3100/
+   
+.. [#pep344]
+   http://www.python.org/dev/peps/pep-0344/
+
+.. [#firstproposal]
+   http://mail.python.org/pipermail/python-dev/2006-March/062449.html
+
+.. [#renaming]
+   http://mail.python.org/pipermail/python-dev/2006-March/062640.html
+   
+.. [#grammar]
+   http://www.python.org/doc/current/ref/try.html
+   
+.. [#except-translation]
+   http://mail.python.org/pipermail/python-3000/2007-January/005395.html
+   
+.. [#translation-checkin]
+   http://svn.python.org/view?rev=53342&view=rev
+   
+.. [#2to3]
+   http://svn.python.org/view/sandbox/trunk/2to3/
+   
+.. [#exceptfixer]
+   http://svn.python.org/view/sandbox/trunk/2to3/fixes/fix_except.py
+   
+.. [#drop-excinfo]
+   http://mail.python.org/pipermail/python-3000/2007-January/005385.html
+   
+.. [#replace-excinfo]
+   http://mail.python.org/pipermail/python-3000/2007-January/005604.html
+
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+
+
+
+..
+   Local Variables:
+   mode: indented-text
+   indent-tabs-mode: nil
+   sentence-end-double-space: t
+   fill-column: 70
+   coding: utf-8
+   End:


More information about the Python-checkins mailing list