JavaScript антитихие методы для указания на отказ

Что было бы хорошим способом сообщить, что ошибки в JavaScript вместо доверия аннулируют, и undefineds, когда ошибки действительно происходят, и функция не может продолжиться вперед. Я могу думать о трех подходах:

  1. ничего не сделайте
  2. выдайте исключение
  3. утверждать

Вот простой сценарий в качестве примера - функция, которая приписывает учетной записи пользователя сумму, переданную в. Функция 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;
}

Из этих подходов, что было бы хорошим способом иметь дело с неожиданными значениями и несчастными путями. Разве там какие-либо другие подходы не упоминаются здесь, который мог быть полезным?

10
задан Anurag 17 July 2010 в 01:28
поделиться

2 ответа

Рассмотрим фреймворк протоколирования на стороне клиента для сообщения об ошибках, например Log4js. Можно регистрировать сообщения (например, info, debug, warn, error) в браузере или передавать сообщения на сервер через Ajax, в зависимости от приложения.

На сайте Log4js также представлен список других JavaScript-фреймворков для ведения логов.

Хорошим подходом на примере вашего пользовательского исключения будет бросить исключение и записать ошибку в журнал, как вы считаете нужным.

3
ответ дан 4 December 2019 в 03:15
поделиться

Один недостаток по сравнению с вышеизложенным подход заключается в том, что поскольку утверждение общий, мы теряем способность бросать пользовательские исключения

Не обязательно:

function assert(value,message,Exctype) {
    if(value !== true) throw new Exctype(message);
}

Конструкторы - это функции. Функции - это первоклассные ценности. Не стесняйтесь раздавать их.

3
ответ дан 4 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: