From: Jo-Philipp Wich Date: Tue, 28 May 2019 16:57:43 +0000 (+0200) Subject: luci-base: luci.js: rework L.error() X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=8a6b89c671f864cb3033287211e4438b16ea5eb7;p=oweals%2Fluci.git luci-base: luci.js: rework L.error() Factor out an L.raise() function out of L.error() which constructs and throws an exception object. Rework the remaining L.error() function to internally use L.raise() to construct exceptionts to render. Signed-off-by: Jo-Philipp Wich --- diff --git a/modules/luci-base/htdocs/luci-static/resources/luci.js b/modules/luci-base/htdocs/luci-static/resources/luci.js index 24af80f69..6332790c7 100644 --- a/modules/luci-base/htdocs/luci-static/resources/luci.js +++ b/modules/luci-base/htdocs/luci-static/resources/luci.js @@ -591,7 +591,7 @@ window.cbi_init = function() {}; }, - error: function(type, fmt /*, ...*/) { + raise: function(type, fmt /*, ...*/) { var e = null, msg = fmt ? String.prototype.format.apply(fmt, this.varargs(arguments, 2)) : null, stack = null; @@ -606,36 +606,44 @@ else { e = new (window[type || 'Error'] || Error)(msg || 'Unspecified error'); e.name = type || 'Error'; + } - try { throw new Error('stacktrace') } - catch (e2) { stack = (e2.stack || '').split(/\n/) } + if (window.console && console.debug) + console.debug(e); - /* IE puts the exception message into the first line */ - if (stack[0] == 'Error: stacktrace') - stack.shift(); + throw e; + }, - /* Pop L.error() invocation from stack */ - stack.shift(); + error: function(type, fmt /*, ...*/) { + try { + L.raise.apply(L, Array.prototype.slice.call(arguments)); } + catch (e) { + var stack = (e.stack || '').split(/\n/).map(function(frame) { + frame = frame.replace(/(.*?)@(.+):(\d+):(\d+)/g, 'at $1 ($2:$3:$4)').trim(); + return frame ? ' ' + frame : ''; + }); - /* Append shortened & beautified stacktrace to message */ - var trace = stack.join('\n') - .replace(/(.*?)@(.+):(\d+):(\d+)/g, ' at $1 ($2:$3:$4)'); + if (!/^ at /.test(stack[0])) + stack.shift(); - if (e.message.indexOf(trace) == -1) - e.message += '\n' + trace; + if (/\braise /.test(stack[0])) + stack.shift(); - if (window.console && console.debug) - console.debug(e); + if (/\berror /.test(stack[0])) + stack.shift(); - if (this.ui) - this.ui.showModal(_('Runtime error'), - E('pre', { 'class': 'alert-message error' }, e)); - else - L.dom.content(document.querySelector('#maincontent'), - E('pre', { 'class': 'alert-message error' }, e)); + stack = stack.length ? '\n' + stack.join('\n') : ''; - throw e; + if (L.ui) + L.ui.showModal(e.name || _('Runtime error'), + E('pre', { 'class': 'alert-message error' }, e.message + stack)); + else + L.dom.content(document.querySelector('#maincontent'), + E('pre', { 'class': 'alert-message error' }, e + stack)); + + throw e; + } }, bind: function(fn, self /*, ... */) {