Методы защиты JavaScript от отключения звука для указания сбоя
-
16-09-2020 - |
Вопрос
Что было бы хорошим способом сообщать об ошибках в JavaScript вместо того, чтобы полагаться на нули и неопределенные значения, когда ошибки действительно возникают и функция не может продолжить работу.Я могу придумать три подхода:
- ничего не делай
- создать исключение
- утверждать
Вот простой пример сценария - функция, которая зачисляет на учетную запись пользователя переданную сумму.Функция 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);
}
Конструкторы - это функции.Функции - это значения первого класса.Не стесняйтесь раздавать их по кругу.