Fixed #19923 -- Display tracebacks for non-CommandError exceptions

By default, show tracebacks for management command errors when the
exception is not a CommandError.
Thanks Jacob Radford for the report.
This commit is contained in:
Claude Paroz 2013-03-09 12:38:45 +01:00
parent 5e80571bf9
commit 6a91b63842
3 changed files with 24 additions and 7 deletions

View file

@ -16,7 +16,7 @@ import codecs
from django import conf, bin, get_version
from django.conf import settings
from django.core.management import BaseCommand
from django.core.management import BaseCommand, CommandError
from django.db import connection
from django.test.simple import DjangoTestSuiteRunner
from django.utils import unittest
@ -1297,22 +1297,34 @@ class CommandTypes(AdminScriptTestCase):
Also test proper traceback display.
"""
command = BaseCommand()
command.execute = lambda args: args # This will trigger TypeError
def raise_command_error(*args, **kwargs):
raise CommandError("Custom error")
old_stderr = sys.stderr
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)
command.execute = raise_command_error
err.truncate(0)
with self.assertRaises(SystemExit):
command.run_from_argv(['', ''])
err_message = err.getvalue()
self.assertNotIn("Traceback", err_message)
self.assertIn("TypeError", err_message)
self.assertIn("CommandError", err_message)
err.truncate(0)
with self.assertRaises(SystemExit):
command.run_from_argv(['', '', '--traceback'])
err_message = err.getvalue()
self.assertIn("Traceback (most recent call last)", err_message)
self.assertIn("TypeError", err_message)
self.assertIn("CommandError", err_message)
finally:
sys.stderr = old_stderr