[Python-checkins] cpython: Raise our own SubprocessError rather than a RuntimeError in when dealing with

gregory.p.smith python-checkins at python.org
Sun Nov 11 08:53:55 CET 2012


http://hg.python.org/cpython/rev/9180fb4eccc7
changeset:   80375:9180fb4eccc7
user:        Gregory P. Smith <greg at krypto.org>
date:        Sat Nov 10 23:53:47 2012 -0800
summary:
  Raise our own SubprocessError rather than a RuntimeError in when dealing with
odd rare errors coming from the subprocess module.

files:
  Lib/subprocess.py           |  12 ++++++------
  Lib/test/test_subprocess.py |   6 +++---
  Misc/NEWS                   |   3 +++
  Modules/_posixsubprocess.c  |   2 +-
  4 files changed, 13 insertions(+), 10 deletions(-)


diff --git a/Lib/subprocess.py b/Lib/subprocess.py
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1042,9 +1042,9 @@
                 w9xpopen = os.path.join(os.path.dirname(sys.base_exec_prefix),
                                         "w9xpopen.exe")
                 if not os.path.exists(w9xpopen):
-                    raise RuntimeError("Cannot locate w9xpopen.exe, which is "
-                                       "needed for Popen to work with your "
-                                       "shell or platform.")
+                    raise SubprocessError(
+                            "Cannot locate w9xpopen.exe, which is needed for "
+                            "Popen to work with your shell or platform.")
             return w9xpopen
 
 
@@ -1414,12 +1414,12 @@
                 except ValueError:
                     warnings.warn(RuntimeWarning(
                             'Bad exception data: %r' % errpipe_data))
-                    exception_name = b'RuntimeError'
+                    exception_name = b'SubprocessError'
                     hex_errno = b'0'
                     err_msg = b'Unknown'
                 child_exception_type = getattr(
                         builtins, exception_name.decode('ascii'),
-                        RuntimeError)
+                        SubprocessError)
                 for fd in (p2cwrite, c2pread, errread):
                     if fd != -1:
                         os.close(fd)
@@ -1452,7 +1452,7 @@
                 self.returncode = _WEXITSTATUS(sts)
             else:
                 # Should never happen
-                raise RuntimeError("Unknown child exit status!")
+                raise SubprocessError("Unknown child exit status!")
 
 
         def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid,
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1179,7 +1179,7 @@
         try:
             p = subprocess.Popen([sys.executable, "-c", ""],
                                  preexec_fn=raise_it)
-        except RuntimeError as e:
+        except subprocess.SubprocessError as e:
             self.assertTrue(
                     subprocess._posixsubprocess,
                     "Expected a ValueError from the preexec_fn")
@@ -1544,12 +1544,12 @@
             # Pure Python implementations keeps the message
             self.assertIsNone(subprocess._posixsubprocess)
             self.assertEqual(str(err), "surrogate:\uDCff")
-        except RuntimeError as err:
+        except subprocess.SubprocessError as err:
             # _posixsubprocess uses a default message
             self.assertIsNotNone(subprocess._posixsubprocess)
             self.assertEqual(str(err), "Exception occurred in preexec_fn.")
         else:
-            self.fail("Expected ValueError or RuntimeError")
+            self.fail("Expected ValueError or subprocess.SubprocessError")
 
     def test_undecodable_env(self):
         for key, value in (('test', 'abc\uDCFF'), ('test\uDCFF', '42')):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -116,6 +116,9 @@
 Library
 -------
 
+- The subprocess module now raises its own SubprocessError instead of a
+  RuntimeError in various error situations which should not normally happen.
+
 - Issue #16327: The subprocess module no longer leaks file descriptors
   used for stdin/stdout/stderr pipes to the child when fork() fails.
 
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -497,7 +497,7 @@
         /* We can't call strerror(saved_errno).  It is not async signal safe.
          * The parent process will look the error message up. */
     } else {
-        unused = write(errpipe_write, "RuntimeError:0:", 15);
+        unused = write(errpipe_write, "SubprocessError:0:", 18);
         unused = write(errpipe_write, err_msg, strlen(err_msg));
     }
     if (unused) return;  /* silly? yes! avoids gcc compiler warning. */

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list