diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py
index 8d9d6f2..011f7ab 100644
--- a/django/utils/autoreload.py
+++ b/django/utils/autoreload.py
@@ -28,7 +28,7 @@
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import os, sys, time
+import os, sys, time, traceback
 
 try:
     import thread
@@ -48,9 +48,11 @@ RUN_RELOADER = True
 _mtimes = {}
 _win = (sys.platform == "win32")
 
+_error_files = []
+
 def code_changed():
     global _mtimes, _win
-    for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
+    for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())) + _error_files:
         if filename.endswith(".pyc") or filename.endswith(".pyo"):
             filename = filename[:-1]
         if not os.path.exists(filename):
@@ -64,9 +66,33 @@ def code_changed():
             continue
         if mtime != _mtimes[filename]:
             _mtimes = {}
+            try:
+                del _error_files[_error_files.index(filename)]
+            except ValueError: pass
             return True
     return False
 
+def check_errors(fn):
+    def wrapper(*args, **kwargs):
+        try:
+            fn(*args, **kwargs)
+        except (ImportError, IndentationError,
+                NameError, SyntaxError, TypeError), msg:
+            et, ev, tb = sys.exc_info()
+
+            if getattr(ev, 'filename', None) is None:
+                # get the filename from the last item in the stack
+                filename = traceback.extract_tb(tb)[-1][0]
+            else:
+                filename = ev.filename
+
+            if filename not in _error_files:
+                _error_files.append(filename)
+
+            raise
+
+    return wrapper
+
 def reloader_thread():
     while RUN_RELOADER:
         if code_changed():
@@ -115,5 +141,7 @@ def main(main_func, args=None, kwargs=None):
         reloader = jython_reloader
     else:
         reloader = python_reloader
-    reloader(main_func, args, kwargs)
+
+    wrapped_main_func = check_errors(main_func)
+    reloader(wrapped_main_func, args, kwargs)
 
