/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; /* General utilities used throughout devtools. */ /** * Turn the error |aError| into a string, without fail. */ this.safeErrorString = function safeErrorString(aError) { try { let errorString = aError.toString(); if (typeof errorString === "string") { // Attempt to attach a stack to |errorString|. If it throws an error, or // isn't a string, don't use it. try { if (aError.stack) { let stack = aError.stack.toString(); if (typeof stack === "string") { errorString += "\nStack: " + stack; } } } catch (ee) { } return errorString; } } catch (ee) { } return ""; } /** * Report that |aWho| threw an exception, |aException|. */ this.reportException = function reportException(aWho, aException) { let msg = aWho + " threw an exception: " + safeErrorString(aException); dump(msg + "\n"); if (Components.utils.reportError) { /* * Note that the xpcshell test harness registers an observer for * console messages, so when we're running tests, this will cause * the test to quit. */ Components.utils.reportError(msg); } } /** * Given a handler function that may throw, return an infallible handler * function that calls the fallible handler, and logs any exceptions it * throws. * * @param aHandler function * A handler function, which may throw. * @param aName string * A name for aHandler, for use in error messages. If omitted, we use * aHandler.name. * * (SpiderMonkey does generate good names for anonymous functions, but we * don't have a way to get at them from JavaScript at the moment.) */ this.makeInfallible = function makeInfallible(aHandler, aName) { if (!aName) aName = aHandler.name; return function (/* arguments */) { try { return aHandler.apply(this, arguments); } catch (ex) { let who = "Handler function"; if (aName) { who += " " + aName; } reportException(who, ex); } } }