Fixed #20167 -- Preserve the traceback of `ImportError`s in `import_by_path`.
Thanks @carljm for the review.
This commit is contained in:
parent
3ff3212713
commit
2d0db67813
|
@ -3,6 +3,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
|
from django.utils import six
|
||||||
from django.utils.importlib import import_module
|
from django.utils.importlib import import_module
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,8 +20,10 @@ def import_by_path(dotted_path, error_prefix=''):
|
||||||
try:
|
try:
|
||||||
module = import_module(module_path)
|
module = import_module(module_path)
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImproperlyConfigured('%sError importing module %s: "%s"' % (
|
msg = '%sError importing module %s: "%s"' % (
|
||||||
error_prefix, module_path, e))
|
error_prefix, module_path, e)
|
||||||
|
six.reraise(ImproperlyConfigured, ImproperlyConfigured(msg),
|
||||||
|
sys.exc_info()[2])
|
||||||
try:
|
try:
|
||||||
attr = getattr(module, class_name)
|
attr = getattr(module, class_name)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|
|
@ -120,6 +120,16 @@ class ModuleImportTestCase(unittest.TestCase):
|
||||||
import_by_path('unexistent.module.path', error_prefix="Foo")
|
import_by_path('unexistent.module.path', error_prefix="Foo")
|
||||||
self.assertTrue(str(cm.exception).startswith('Foo'))
|
self.assertTrue(str(cm.exception).startswith('Foo'))
|
||||||
|
|
||||||
|
def test_import_error_traceback(self):
|
||||||
|
"""Test preserving the original traceback on an ImportError."""
|
||||||
|
try:
|
||||||
|
import_by_path('test_module.bad_module.content')
|
||||||
|
except ImproperlyConfigured:
|
||||||
|
traceback = sys.exc_info()[2]
|
||||||
|
|
||||||
|
self.assertIsNotNone(traceback.tb_next.tb_next,
|
||||||
|
'Should have more than the calling frame in the traceback.')
|
||||||
|
|
||||||
|
|
||||||
class ProxyFinder(object):
|
class ProxyFinder(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
Loading…
Reference in New Issue