python: Handle errors when loading chained modules more properly.
[ashd.git] / python3 / ashd / wsgidir.py
index 31afd3b..c2efcca 100644 (file)
@@ -33,11 +33,13 @@ argument `.fpy=my.module.foohandler' can be given to pass requests for
 functions, you may want to use the getmod() function in this module.
 """
 
 functions, you may want to use the getmod() function in this module.
 """
 
-import os, threading, types, importlib, getopt
+import sys, os, threading, types, logging, importlib, getopt
 from . import wsgiutil
 
 __all__ = ["application", "wmain", "getmod", "cachedmod", "chain"]
 
 from . import wsgiutil
 
 __all__ = ["application", "wmain", "getmod", "cachedmod", "chain"]
 
+log = logging.getLogger("wsgidir")
+
 class cachedmod(object):
     """Cache entry for modules loaded by getmod()
 
 class cachedmod(object):
     """Cache entry for modules loaded by getmod()
 
@@ -180,7 +182,11 @@ def chain(env, startreq):
     object.
     """
     path = env["SCRIPT_FILENAME"]
     object.
     """
     path = env["SCRIPT_FILENAME"]
-    mod = getmod(path)
+    try:
+        mod = getmod(path)
+    except Exception:
+        log.error("Exception occurred when loading %s" % path, exc_info=sys.exc_info())
+        return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "Could not load WSGI handler.")
     entry = None
     if mod is not None:
         with mod.lock:
     entry = None
     if mod is not None:
         with mod.lock: