]> granicus.if.org Git - python/commitdiff
Raise our own SubprocessError rather than a RuntimeError in when dealing with
authorGregory P. Smith <greg@krypto.org>
Sun, 11 Nov 2012 07:53:47 +0000 (23:53 -0800)
committerGregory P. Smith <greg@krypto.org>
Sun, 11 Nov 2012 07:53:47 +0000 (23:53 -0800)
odd rare errors coming from the subprocess module.

Lib/subprocess.py
Lib/test/test_subprocess.py
Misc/NEWS
Modules/_posixsubprocess.c

index db0ba190a63a2b79f4a7e397be723d7d962c01b8..d52f9a45f3986bba246c599bf7a636cbe9bbed07 100644 (file)
@@ -1042,9 +1042,9 @@ class Popen(object):
                 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 @@ class Popen(object):
                 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 @@ class Popen(object):
                 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,
index 2d77554906ff07e931c719fe16693b6bb6d3637d..8978b31fb5f36bbf74a2f8436b484be18fbeb006 100644 (file)
@@ -1179,7 +1179,7 @@ class POSIXProcessTestCase(BaseTestCase):
         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 @@ class POSIXProcessTestCase(BaseTestCase):
             # 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')):
index 2187c80d50099574814e52c39e8b59815a10b183..30e32173683b410eb2de6682ed2f3e64e7f284f6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -116,6 +116,9 @@ Core and Builtins
 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.
 
index b7b120ba51009689000741271468efbee3f22454..4ccd38bb6d65923613579271c2d7200dff56435e 100644 (file)
@@ -497,7 +497,7 @@ error:
         /* 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. */