Kaydet (Commit) 2d0db678 authored tarafından Joe Friedl's avatar Joe Friedl Kaydeden (comit) Simon Charette

Fixed #20167 -- Preserve the traceback of `ImportError`s in `import_by_path`.

Thanks @carljm for the review.
üst 3ff32127
...@@ -3,6 +3,7 @@ import os ...@@ -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=''): ...@@ -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): ...@@ -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):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment