libs/web: more verbose faults
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 21 Jul 2011 01:04:53 +0000 (01:04 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 21 Jul 2011 01:04:53 +0000 (01:04 +0000)
libs/web/luasrc/dispatcher.lua
libs/web/luasrc/template.lua

index 8da1081..e29bd52 100644 (file)
@@ -385,11 +385,16 @@ function dispatch(request)
                        setfenv(target, env)
                end)
 
+               local ok, err
                if type(c.target) == "table" then
-                       target(c.target, unpack(args))
+                       ok, err = util.copcall(target, c.target, unpack(args))
                else
-                       target(unpack(args))
+                       ok, err = util.copcall(target, unpack(args))
                end
+               assert(ok,
+                      "Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
+                      " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
+                      "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))
        else
                local root = node()
                if not root or not root.target then
@@ -397,7 +402,7 @@ function dispatch(request)
                                 "Install luci-admin-full and retry. " ..
                                 "If the module is already installed, try removing the /tmp/luci-indexcache file.")
                else
-                       error404("No page is registered at '" .. table.concat(request, "/") .. "/'.\n" ..
+                       error404("No page is registered at '/" .. table.concat(request, "/") .. "'.\n" ..
                                 "If this url belongs to an extension, make sure it is properly installed.\n" ..
                                 "If the extension was recently installed, try removing the /tmp/luci-indexcache file.")
                end
@@ -477,11 +482,20 @@ function createindex_plain(path, suffixes)
                end
 
                local mod = require(modname)
+               assert(mod ~= true,
+                      "Invalid controller file found\n" ..
+                      "The file '" .. c .. "' contains an invalid module line.\n" ..
+                      "Please verify whether the module name is set to '" .. modname ..
+                      "' - It must correspond to the file path!")
+               
                local idx = mod.index
+               assert(type(idx) == "function",
+                      "Invalid controller file found\n" ..
+                      "The file '" .. c .. "' contains no index() function.\n" ..
+                      "Please make sure that the controller contains a valid " ..
+                      "index function and verify the spelling!")
 
-               if type(idx) == "function" then
-                       index[modname] = idx
-               end
+               index[modname] = idx
        end
 
        if indexcache then
index 80a3206..962c2ea 100644 (file)
@@ -78,7 +78,10 @@ function Template.__init__(self, name)
 
                -- If we have no valid template throw error, otherwise cache the template
                if not self.template then
-                       error(err)
+                       error("Failed to load template '" .. name .. "'.\n" ..
+                             "Error while parsing template '" .. sourcefile .. "'.\n" ..
+                             "A syntax error occured near '" ..
+                             (err or "(nil)"):gsub("\t", "\\t"):gsub("\n", "\\n") .. "'.")
                else
                        self.cache[name] = self.template
                end
@@ -99,6 +102,7 @@ function Template.render(self, scope)
        -- Now finally render the thing
        local stat, err = util.copcall(self.template)
        if not stat then
-               error("Error in template %s: %s" % {self.name, err})
+               error("Failed to execute template '" .. self.name .. "'.\n" ..
+                     "A runtime error occured: " .. tostring(err or "(nil)"))
        end
 end