Методы защиты JavaScript от отключения звука для указания сбоя

StackOverflow https://stackoverflow.com/questions/3269802

Вопрос

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

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

Четвертый подход, аналогичный выбрасыванию исключений, заключается в использовании утверждений в вашем коде.Одним из недостатков по сравнению с описанным выше подходом является то, что, поскольку 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;
}

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top