Что было бы хорошим способом сообщить об ошибках в JavaScript вместо того, чтобы полагаться на значения NULL, и не определено, когда возникают ошибки, и функция не может двигаться вперед. Я могу думать о трех подходах: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;
}
Четвертый подход, подобный исключениям исключения, заключается в использовании утверждений в вашем коде. Один недостаток по сравнению с вышеприведенным подходом состоит в том, что, поскольку утверждение является общим, мы теряем способность бросать пользовательские исключения. Это все еще возможно, хотя, передавая объект, чтобы бросить в каждом утвердительном вызове.
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;
}
Из этих подходов, что было бы хорошим способом справиться с неожиданными значениями и несчастливыми путями. Существуют ли какие-либо другие подходы, не упомянутые здесь, которые могут быть полезны?
'alert()' антишумовый :) –
Это один из самых раздражающих аспектов динамически типизированных языков. – ChaosPandion
@meder - haha, 'alert' является самым громким из всех :) – Anurag