python: Handle errors when loading chained modules more properly.
authorFredrik Tolf <fredrik@dolda2000.com>
Mon, 16 Jul 2012 06:11:20 +0000 (08:11 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Mon, 16 Jul 2012 06:11:20 +0000 (08:11 +0200)
python/ashd/wsgidir.py
python3/ashd/wsgidir.py

index 2da3a94..6bf00b6 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, getopt
+import sys, os, threading, types, logging, getopt
 import wsgiutil
 
 __all__ = ["application", "wmain", "getmod", "cachedmod", "chain"]
 
 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()
 
@@ -192,7 +194,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:
         mod.lock.acquire()
     entry = None
     if mod is not None:
         mod.lock.acquire()
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: