]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Improve autoreload for import-time errors.
authorBen Darnell <ben@bendarnell.com>
Sun, 2 Sep 2012 16:55:31 +0000 (09:55 -0700)
committerBen Darnell <ben@bendarnell.com>
Sun, 2 Sep 2012 16:55:31 +0000 (09:55 -0700)
We already had a special case for SyntaxErrors, but NameErrors and other
import-time errors could leave a file unwatched.

tornado/autoreload.py

index 55a10d10cc5aa2ff2d6f2386fd3aa6477175f389..940c2be7a78088272333081bd73e6c13cc76fb39 100644 (file)
@@ -71,6 +71,7 @@ import logging
 import os
 import pkgutil
 import sys
+import traceback
 import types
 import subprocess
 
@@ -275,7 +276,16 @@ def main():
         logging.info("Script exited with status %s", e.code)
     except Exception, e:
         logging.warning("Script exited with uncaught exception", exc_info=True)
+        # If an exception occurred at import time, the file with the error
+        # never made it into sys.modules and so we won't know to watch it.
+        # Just to make sure we've covered everything, walk the stack trace
+        # from the exception and watch every file.
+        for (filename, lineno, name, line) in traceback.extract_tb(sys.exc_info()[2]):
+            watch(filename)
         if isinstance(e, SyntaxError):
+            # SyntaxErrors are special:  their innermost stack frame is fake
+            # so extract_tb won't see it and we have to get the filename
+            # from the exception object.
             watch(e.filename)
     else:
         logging.info("Script exited normally")