Fixed #20445 -- Raised original exception after command error
This commit is contained in:
parent
4280217f31
commit
888c86dcf3
|
@ -7,7 +7,6 @@ import os
|
|||
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 @@ class BaseCommand(object):
|
|||
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 @@ class BaseCommand(object):
|
|||
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):
|
||||
|
|
|
@ -1305,13 +1305,15 @@ class CommandTypes(AdminScriptTestCase):
|
|||
sys.stderr = err = StringIO()
|
||||
try:
|
||||
command.execute = lambda args: args # This will trigger TypeError
|
||||
with self.assertRaises(SystemExit):
|
||||
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 not CommandError it should always
|
||||
# raise the original exception.
|
||||
with self.assertRaises(TypeError):
|
||||
command.run_from_argv(['', ''])
|
||||
|
||||
# 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 @@ class CommandTypes(AdminScriptTestCase):
|
|||
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue