Что было бы хорошим способом сообщать об ошибках в JavaScript, вместо того, чтобы полагаться на пустые значения, и неопределенным, когда ошибки возникают, и функция не может продолжить работу.Я могу придумать три подхода:
- ничего не делать
- выбросить исключение
- 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;
}
Из этих подходов, что было бы хорошим способом справиться с неожиданными значениями и несчастными путями.Есть ли другие подходы, не упомянутые здесь, которые могут быть полезны?