3

I'm defining custom JavaScript exceptions like the code below. Is this proper? Isn't there a shorter way?

function InvalidModuleError(moduleName) {
    TypeError.apply(this);
    this.message = "module '" + moduleName + "' doesn't export any definitions";
    this.name = 'InvalidModuleError';
};

InvalidModuleError.prototype = Object.create(TypeError.prototype);


function DuplicateModuleError(moduleName) {
    TypeError.apply(this);
    this.message = "module '" + moduleName + "' is already defined";
    this.name = 'DuplicateModuleError';
};

DuplicateModuleError.prototype = Object.create(TypeError.prototype);

Edit: Eventually, after Oriol's suggestion, I've made a function that generates exceptions and looks like this:

function makeException(parentObject, parentClass, name, message) {
    var shortName = name.split('.');
    shortName = shortName[shortName.length - 1];
    parentObject[shortName] = function() {
        this.message = (typeof message === 'function') ? message.apply(null, arguments) : message;
    };
    parentObject[shortName].prototype = Object.create(parentClass.prototype, {'name': {'value': name}});
}
HankMoody
  • 3,077
  • 1
  • 17
  • 38

1 Answers1

2

Your code can be simplified a bit:

function InvalidModuleError(moduleName) {
    this.message = "module '" + moduleName + "' doesn't export any definitions";
}
InvalidModuleError.prototype = new Error();
InvalidModuleError.prototype.name = 'InvalidModuleError';

function DuplicateModuleError(moduleName) {
    this.message = "module '" + moduleName + "' is already defined";
}
DuplicateModuleError.prototype = new Error();
DuplicateModuleError.prototype.name = 'DuplicateModuleError';

But if you want to have lots of custom exceptions, better use

function newModuleError(errorName, message) {
    var moduleError = function(moduleName) {
        this.message = message.replace('%s', moduleName);
    };
    moduleError.prototype = new Error();
    moduleError.prototype.name = errorName;
    return moduleError; 
};

var InvalidModuleError = newModuleError('InvalidModuleError', "module '%s' doesn't export any definitions"),
    DuplicateModuleError = newModuleError('DuplicateModuleError', "module '%s' is already defined");

To throw them:

throw new InvalidModuleError("moduleName1");
throw new DuplicateModuleError("moduleName2");
Oriol
  • 274,082
  • 63
  • 437
  • 513
  • I'm defining exceptions. It seems, that without prototype inheritance (`MyException.prototype = Object.create(BaseException.prototype);`) exceptions are not printed in browser's console properly (maybe I'm doing something wrong). – HankMoody Nov 24 '13 at 21:15
  • @PythonFanboy I have added a `toString` method to display it well. – Oriol Nov 24 '13 at 21:25
  • @PythonFanboy I have updated it to throw real errors instead of objects with `.toString` – Oriol Nov 24 '13 at 23:07