Return to Snippet

Revision: 12796
at April 19, 2009 14:56 by Sephr


Updated Code
function ErrorConstructor(constructorName) {
  var errorConstructor = function(message, fileName, lineNumber) {
  // don't directly name this function, .name is used by Error.prototype.toString
    if (this == window) return new arguments.callee(message, fileName, lineNumber);
    this.name = errorConstructor.name;
    this.message = message||"";
    this.fileName = fileName||location.href;
    if (!isNaN(+lineNumber)) this.lineNumber = +lineNumber;
    else this.lineNumber = 1;
  }
  errorConstructor.name = constructorName||Error.prototype.name;
  errorConstructor.prototype.toString = Error.prototype.toString;
  
  return errorConstructor;
}

// This part is optional and simulates an Error object for Object.prototype.toString
(function(){
  var realObjectToString = Object.prototype.toString,
  realFunctionToString = Function.prototype.toString;

  Object.prototype.toString = function() {
    if (this.constructor.prototype.toString === Error.prototype.toString)
      return "[object Error]";
    else
      return realObjectToString.call(this);
  };

  Function.prototype.toString = function() {
    if (this === Function.prototype.toString 
     || this === Object.prototype.toString)
      return realObjectToString.toString();
    else
      return realFunctionToString.call(this);
  }
})()

Revision: 12795
at March 29, 2009 01:35 by Sephr


Updated Code
function ErrorConstructor(constructorName) {
  var errorConstructor = function(message, fileName, lineNumber) {
  // don't directly name this function, .name is used by Error.prototype.toString
    if (this == window) return new arguments.callee(message, fileName, lineNumber);
    this.name = errorConstructor.name;
    this.message = message||"";
    this.fileName = fileName||location.href;
    if (!isNaN(+lineNumber)) this.lineNumber = +lineNumber;
    else this.lineNumber = 1;
  }
  errorConstructor.name = constructorName||Error.prototype.name;
  errorConstructor.prototype.toString = Error.prototype.toString;
  
  return errorConstructor;
}

Revision: 12794
at March 29, 2009 00:52 by Sephr


Updated Code
function ErrorConstructor(constructorName) {
  var errorConstructor = function(message, fileName, lineNumber) {
    if (this == window) return new arguments.callee(message, fileName, lineNumber);
    this.name = errorConstructor.name;
    this.message = message||"";
    this.fileName = fileName||location.href;
    if (!isNaN(+lineNumber)) this.lineNumber = +lineNumber;
    else this.lineNumber = 1;
  }
  errorConstructor.name = constructorName||Error.prototype.name;
  errorConstructor.prototype.toString = Error.prototype.toString;
  
  return errorConstructor;
}

Revision: 12793
at March 29, 2009 00:27 by Sephr


Initial Code
function ErrorConstructor(constructorName) {
  var errorConstructor = function(message, fileName, lineNumber) {
    if (this == window) return new arguments.callee(message, fileName, lineNumber);
    this.name = errorConstructor.name;
    if (typeof message == "undefined") message = "";
    this.message = message;
    this.fileName = fileName||location.href;
    if (!isNaN(lineNumber)) this.lineNumber = lineNumber;
    else this.lineNumber = 1;
  }
  errorConstructor.name = constructorName||Error.prototype.name;
  errorConstructor.prototype.toString = Error.prototype.toString;
  
  return errorConstructor;
}

Initial URL
http://eligrey.com/2009/03/29/custom-error-constructors/

Initial Description
ErrorConstructor produces error constructors that behave the same way as the seven native error constructors.

Usage: `ErrorConstructor([constructorName])`

*If no constructorName is specified, the default of `Error.prototype.name` is used*

Usage for generated error constructor: `errorConstructor([message[, location[, lineNumber]])`

Examples:

    var SecurityError = ErrorConstructor("Security Error"),
    MarkupError = ErrorConstructor("(X)HTML Markup Error");
    //these will both throw a SecurityError starting with "Security Error on line 83:"
    var xss_error = "Possible XSS Vector\n\
     JSON XHR response parsed with eval()\n\
     Recommended fix: Parse JSON with JSON.parse";
    throw new SecurityError(xss_error, "/js/searchResultsJSONloader.js", 83);
    throw SecurityError(xss_error, "/js/searchResultsJSONloader.js", 83);
    //these will both throw the following MarkupError:
    //"(X)HTML Markup Error on line 1: Invalid DOCTYPE"
    throw new MarkupError("Invalid DOCTYPE");
    throw MarkupError("Invalid DOCTYPE");

Initial Title
ErrorConstructor

Initial Tags
error

Initial Language
JavaScript