2013-11-24 6 views
3

Я определяю пользовательские исключения JavaScript, как приведенный ниже код. Это правильно? Разве нет более короткого пути?Более короткий способ определения пользовательских исключений JavaScript?

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: В конце концов, после того, как предложение Ориоль, я сделал функцию, которая генерирует исключения и выглядит следующим образом:

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}}); 
} 

ответ

2

Ваш код может быть немного упрощен:

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'; 

Но если вы хотите иметь множество пользовательских исключений, лучше использовать

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"); 

Бросать их:

throw new InvalidModuleError("moduleName1"); 
throw new DuplicateModuleError("moduleName2"); 
+0

Я определения исключений. Кажется, что без наследования прототипа ('MyException.prototype = Object.create (BaseException.prototype);') исключения не печатаются в консоли браузера должным образом (возможно, я делаю что-то неправильно). – HankMoody

+0

@PythonFanboy Я добавил метод 'toString', чтобы отобразить его хорошо. – Oriol

+0

@PythonFanboy Я обновил его, чтобы генерировать реальные ошибки вместо объектов с '.toString' – Oriol