Nick's input
This commit is contained in:
parent
8b37e1a751
commit
e47d5fc5f3
74
pep-3151.txt
74
pep-3151.txt
|
@ -95,7 +95,7 @@ exception specifics has to examine the ``errno`` or ``winerror`` attribute
|
||||||
anyway.
|
anyway.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
**Appendix B** surveys the use of the various exception types accross
|
`Appendix B`_ surveys the use of the various exception types accross
|
||||||
the interpreter and the standard library.
|
the interpreter and the standard library.
|
||||||
|
|
||||||
|
|
||||||
|
@ -196,24 +196,55 @@ programs.
|
||||||
Careful code should not be penalized.
|
Careful code should not be penalized.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Step 1:
|
||||||
|
|
||||||
Step 1: coalesce exception types
|
Step 1: coalesce exception types
|
||||||
================================
|
================================
|
||||||
|
|
||||||
The first step of the resolution is to coalesce existing exception types.
|
The first step of the resolution is to coalesce existing exception types.
|
||||||
The extent of this step is not yet fully determined. A number of possible
|
The following changes are proposed:
|
||||||
changes are listed hereafter:
|
|
||||||
|
|
||||||
* alias both socket.error and select.error to IOError
|
* alias both socket.error and select.error to IOError
|
||||||
* alias mmap.error to OSError
|
* alias mmap.error to OSError
|
||||||
* alias IOError to OSError
|
|
||||||
* alias WindowsError to OSError
|
* alias WindowsError to OSError
|
||||||
|
* alias OSError to IOError
|
||||||
|
* coalesce EnvironmentError into IOError
|
||||||
|
|
||||||
Each of these changes doesn't preserve exact compatibility, but it does
|
Each of these changes doesn't preserve exact compatibility, but it does
|
||||||
preserve *useful compatibility* (see "compatibility" section above).
|
preserve *useful compatibility* (see "compatibility" section above).
|
||||||
|
|
||||||
Not only does this first step present the user a simpler landscape, but
|
Each of these changes can be accepted or refused invididually, but of course
|
||||||
it also allows for a better and more complete resolution of step 2
|
it is considered that the greatest impact can be achieved if this first step
|
||||||
(see "Prerequisite" below).
|
is accepted in full. In this case, the IO exception subhierarchy would
|
||||||
|
become::
|
||||||
|
|
||||||
|
+-- IOError (replacing OSError, WindowsError, EnvironmentError, etc.)
|
||||||
|
+-- io.BlockingIOError
|
||||||
|
+-- io.UnsupportedOperation (also inherits from ValueError)
|
||||||
|
|
||||||
|
Justification
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Not only does this first step present the user a simpler landscape as
|
||||||
|
explained in the rationale_ section, but it also allows for a better
|
||||||
|
and more complete resolution of `Step 2`_ (see Prerequisite_).
|
||||||
|
|
||||||
|
The rationale for keeping ``IOError`` as the official name for generic
|
||||||
|
OS-related exceptions is the survey in `Appendix B`_, which shows it is the
|
||||||
|
dominant error today in the standard library. ``EnvironmentError`` might
|
||||||
|
be more accurate, but it is more tedious to type and also much lesser-known.
|
||||||
|
As for third-party Python code, Google Code Search shows IOError
|
||||||
|
being ten times more popular than EnvironmentError in user code, and
|
||||||
|
three times more popular than OSError [3]_.
|
||||||
|
|
||||||
|
Exception attributes
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Coalescing WindowsError would mean the ``winerr`` attribute would be
|
||||||
|
present on all platforms, just set to ``None`` if the platform
|
||||||
|
isn't Windows. Indeed, ``errno``, ``filename`` and ``strerror`` can all
|
||||||
|
already be None, as is often the case when IOError is raised directly
|
||||||
|
by Python code.
|
||||||
|
|
||||||
Deprecation of names
|
Deprecation of names
|
||||||
--------------------
|
--------------------
|
||||||
|
@ -224,13 +255,15 @@ Deprecation of names from the root namespace presents some implementation
|
||||||
challenges, especially where performance is important.
|
challenges, especially where performance is important.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Step 2:
|
||||||
|
|
||||||
Step 2: define additional subclasses
|
Step 2: define additional subclasses
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
The second step of the resolution is to extend the hierarchy by defining
|
The second step of the resolution is to extend the hierarchy by defining
|
||||||
subclasses which will be raised, rather than their parent, for specific
|
subclasses which will be raised, rather than their parent, for specific
|
||||||
errno values. Which errno values is subject to discussion, but a survey
|
errno values. Which errno values is subject to discussion, but a survey
|
||||||
of existing exception matching practices (see **Appendix A**) helps us
|
of existing exception matching practices (see `Appendix A`_) helps us
|
||||||
propose a reasonable subset of all values. Trying to map all errno
|
propose a reasonable subset of all values. Trying to map all errno
|
||||||
mnemonics, indeed, seems foolish, pointless, and would pollute the root
|
mnemonics, indeed, seems foolish, pointless, and would pollute the root
|
||||||
namespace.
|
namespace.
|
||||||
|
@ -246,7 +279,7 @@ attributes").
|
||||||
Prerequisite
|
Prerequisite
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Step 1 is a loose prerequisite for this.
|
`Step 1`_ is a loose prerequisite for this.
|
||||||
|
|
||||||
Prerequisite, because some errnos can currently be attached to different
|
Prerequisite, because some errnos can currently be attached to different
|
||||||
exception classes: for example, EBADF can be attached to both OSError and
|
exception classes: for example, EBADF can be attached to both OSError and
|
||||||
|
@ -304,13 +337,12 @@ the list of errnos mapped to them, is submitted to discussion:
|
||||||
as a generic timeout exception, useful for other types of timeout (for
|
as a generic timeout exception, useful for other types of timeout (for
|
||||||
example in Lock.acquire())
|
example in Lock.acquire())
|
||||||
|
|
||||||
This list assumes step 1 is accepted in full; the exception classes
|
This list assumes `Step 1`_ is accepted in full; the exception classes
|
||||||
described above would all derive from the now unified exception type
|
described above would all derive from the now unified exception type
|
||||||
OSError. It will need reworking if a partial version of step 1 is accepted
|
OSError. It will need reworking if a partial version of step 1 is accepted
|
||||||
instead (again, see appendix A for the current distribution of errnos
|
instead (again, see appendix A for the current distribution of errnos
|
||||||
and exception types).
|
and exception types).
|
||||||
|
|
||||||
|
|
||||||
Exception attributes
|
Exception attributes
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
@ -423,6 +455,8 @@ defines its own constants for error types (``ssl.SSL_ERROR_WANT_READ``,
|
||||||
etc.).
|
etc.).
|
||||||
|
|
||||||
|
|
||||||
|
.. _Appendix A:
|
||||||
|
|
||||||
Appendix A: Survey of common errnos
|
Appendix A: Survey of common errnos
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
|
@ -504,6 +538,8 @@ Common errnos with select.error
|
||||||
* ``EINTR``: interrupted function call
|
* ``EINTR``: interrupted function call
|
||||||
|
|
||||||
|
|
||||||
|
.. _Appendix B:
|
||||||
|
|
||||||
Appendix B: Survey of raised OS and IO errors
|
Appendix B: Survey of raised OS and IO errors
|
||||||
=============================================
|
=============================================
|
||||||
|
|
||||||
|
@ -740,15 +776,27 @@ zipimport
|
||||||
zipimporter.get_data() can raise IOError.
|
zipimporter.get_data() can raise IOError.
|
||||||
|
|
||||||
|
|
||||||
|
Acknowledgments
|
||||||
|
===============
|
||||||
|
|
||||||
|
Significant input has been received from Nick Coghlan.
|
||||||
|
|
||||||
References
|
References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
.. [1] "IO module precisions and exception hierarchy"
|
.. [1] "IO module precisions and exception hierarchy":
|
||||||
http://mail.python.org/pipermail/python-dev/2009-September/092130.html
|
http://mail.python.org/pipermail/python-dev/2009-September/092130.html
|
||||||
|
|
||||||
.. [2] Discussion of "Removing WindowsError" in PEP 348
|
.. [2] Discussion of "Removing WindowsError" in PEP 348:
|
||||||
http://www.python.org/dev/peps/pep-0348/#removing-windowserror
|
http://www.python.org/dev/peps/pep-0348/#removing-windowserror
|
||||||
|
|
||||||
|
.. [3] Google Code Search of ``IOError`` in Python code: `around 40000 results
|
||||||
|
<http://www.google.com/codesearch?q=lang%3Apython%20IOError>`_;
|
||||||
|
``OSError``: `around 15200 results
|
||||||
|
<http://www.google.com/codesearch?q=lang%3Apython%20OSError>`_;
|
||||||
|
``EnvironmentError``: `around 3000 results
|
||||||
|
<http://www.google.com/codesearch?q=lang%3Apython%20EnvironmentError>`_
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue