Что было бы хорошим способом сообщить, что ошибки в JavaScript вместо доверия аннулируют, и undefineds, когда ошибки действительно происходят, и функция не может продолжиться вперед. Я могу думать о трех подходах:
Вот простой сценарий в качестве примера - функция, которая приписывает учетной записи пользователя сумму, переданную в. Функция credit
часть Account
объект.
Вот наивное решение.
function credit(amount) {
this.balance += amount;
}
Основной проблемой с этим подходом являются недопустимые данные. Давайте согласуем его и давайте использовать возвращаемое значение, чтобы указать, что операция перестала работать.
function credit(amount) {
if(!isInt(amount)) {
return false;
}
this.balance += amount;
}
Это - улучшение по сравнению с предыдущим, но клиентский код должен будет проверить возвращаемое значение, чтобы гарантировать что операция, за которой следуют. Выполнение этого для в основном каждого метода в системе может стать громоздким.
if(!johnDoe.credit(100)) {
// do some error handling here
}
Третий подход, подобный второму, должен выдать исключение. Так как мы выдаем исключение сами, мог бросить определенный тип исключения, а не общего.
function credit(amount) {
if(!isInt(amount)) {
throw new InvalidAmountError(amount);
}
this.balance += amount;
}
Четвертый подход, подобный выдаванию исключения, должен использовать утверждения в Вашем коде. Один недостаток по сравнению с вышеупомянутым подходом - то, что, так как утверждение универсально, мы теряем способность выдать пользовательские исключения. Это все еще возможно, хотя путем передачи объекта добавить каждый утверждает вызов.
function credit(amount) {
assert(!isInt(amount), "Amount to credit is not an integer");
this.balance += amount;
}
Глобальное assert
функцию легко записать и делает код немного короче.
function assert(value, message) {
if(value !== true) {
throw new AssertionError(message);
}
}
function AssertionError(message) {
this.message = message;
}
AssertionError.prototype.toString = function() {
return 'AssertionError: ' + this.message;
}
Из этих подходов, что было бы хорошим способом иметь дело с неожиданными значениями и несчастными путями. Разве там какие-либо другие подходы не упоминаются здесь, который мог быть полезным?
Рассмотрим фреймворк протоколирования на стороне клиента для сообщения об ошибках, например Log4js. Можно регистрировать сообщения (например, info, debug, warn, error) в браузере или передавать сообщения на сервер через Ajax, в зависимости от приложения.
На сайте Log4js также представлен список других JavaScript-фреймворков для ведения логов.
Хорошим подходом на примере вашего пользовательского исключения будет бросить исключение и записать ошибку в журнал, как вы считаете нужным.
Один недостаток по сравнению с вышеизложенным подход заключается в том, что поскольку утверждение общий, мы теряем способность бросать пользовательские исключения
Не обязательно:
function assert(value,message,Exctype) {
if(value !== true) throw new Exctype(message);
}
Конструкторы - это функции. Функции - это первоклассные ценности. Не стесняйтесь раздавать их.