Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #20445 -- Raised original exception after command error

  • Loading branch information...
commit 888c86dcf30defe533451bcefc6e09a6e181389f 1 parent 4280217
@jorgebastida jorgebastida authored claudep committed
Showing with 18 additions and 16 deletions.
  1. +7 −7 django/core/management/base.py
  2. +11 −9 tests/admin_scripts/tests.py
View
14 django/core/management/base.py
@@ -7,7 +7,6 @@
import sys
from optparse import make_option, OptionParser
-import traceback
import django
from django.core.exceptions import ImproperlyConfigured
@@ -171,7 +170,7 @@ class BaseCommand(object):
make_option('--pythonpath',
help='A directory to add to the Python path, e.g. "/home/djangoprojects/myproject".'),
make_option('--traceback', action='store_true',
- help='Print traceback on exception'),
+ help='Raise on exception'),
)
help = ''
args = ''
@@ -231,7 +230,8 @@ def run_from_argv(self, argv):
Set up any environment changes requested (e.g., Python path
and Django settings), then run this command. If the
command raises a ``CommandError``, intercept it and print it sensibly
- to stderr.
+ to stderr. If the ``--traceback`` option is present or the raised
+ ``Exception`` is not ``CommandError``, raise it.
"""
parser = self.create_parser(argv[0], argv[1])
options, args = parser.parse_args(argv[2:])
@@ -239,12 +239,12 @@ def run_from_argv(self, argv):
try:
self.execute(*args, **options.__dict__)
except Exception as e:
+ if options.traceback or not isinstance(e, CommandError):
+ raise
+
# self.stderr is not guaranteed to be set here
stderr = getattr(self, 'stderr', OutputWrapper(sys.stderr, self.style.ERROR))
- if options.traceback or not isinstance(e, CommandError):
- stderr.write(traceback.format_exc())
- else:
- stderr.write('%s: %s' % (e.__class__.__name__, e))
+ stderr.write('%s: %s' % (e.__class__.__name__, e))
sys.exit(1)
def execute(self, *args, **options):
View
20 tests/admin_scripts/tests.py
@@ -1305,13 +1305,15 @@ def raise_command_error(*args, **kwargs):
sys.stderr = err = StringIO()
try:
command.execute = lambda args: args # This will trigger TypeError
- with self.assertRaises(SystemExit):
+
+ # If the Exception is not CommandError it should always
+ # raise the original exception.
+ with self.assertRaises(TypeError):
command.run_from_argv(['', ''])
- err_message = err.getvalue()
- # Exceptions other than CommandError automatically output the traceback
- self.assertIn("Traceback", err_message)
- self.assertIn("TypeError", err_message)
+ # If the Exception is CommandError and --traceback is not present
+ # this command should raise a SystemExit and don't print any
+ # traceback to the stderr.
command.execute = raise_command_error
err.truncate(0)
with self.assertRaises(SystemExit):
@@ -1320,12 +1322,12 @@ def raise_command_error(*args, **kwargs):
self.assertNotIn("Traceback", err_message)
self.assertIn("CommandError", err_message)
+ # If the Exception is CommandError and --traceback is present
+ # this command should raise the original CommandError as if it
+ # were not a CommandError.
err.truncate(0)
- with self.assertRaises(SystemExit):
+ with self.assertRaises(CommandError):
command.run_from_argv(['', '', '--traceback'])
- err_message = err.getvalue()
- self.assertIn("Traceback (most recent call last)", err_message)
- self.assertIn("CommandError", err_message)
finally:
sys.stderr = old_stderr
Please sign in to comment.
Something went wrong with that request. Please try again.