diff --git a/gunicorn/util.py b/gunicorn/util.py index 13e6d65d..c8618b46 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -532,3 +532,15 @@ def warn(msg): print("!!!\n", file=sys.stderr) sys.stderr.flush() + + +def make_fail_app(msg): + + def app(environ, start_response): + start_response("500 Internal Server Error", [ + ("Content-Type", "text/plain"), + ("Content-Length", str(len(msg))) + ]) + return iter([msg]) + + return app diff --git a/gunicorn/workers/base.py b/gunicorn/workers/base.py index a82f6b85..58d0b5ea 100644 --- a/gunicorn/workers/base.py +++ b/gunicorn/workers/base.py @@ -8,6 +8,7 @@ import os import signal import sys import time +import traceback from random import randint @@ -116,7 +117,19 @@ class Worker(object): self.init_signals() - self.wsgi = self.app.wsgi() + try: + self.wsgi = self.app.wsgi() + except SyntaxError as e: + if not self.reloader: + raise + + self.log.exception(e) + + exc_type, exc_val, exc_tb = sys.exc_info() + self.reloader.add_extra_file(exc_val.filename) + + tb_string = traceback.format_exc(exc_tb) + self.wsgi = util.make_fail_app(tb_string) self.cfg.post_worker_init(self)