JavaScript анти-тихие методы, чтобы указать на сбой - PullRequest
10 голосов
/ 17 июля 2010

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 17 июля 2010

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

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

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

3 голосов
/ 17 июля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...