2010-07-17 1 views
9

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

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

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

'alert()' антишумовый :) –

+0

Это один из самых раздражающих аспектов динамически типизированных языков. – ChaosPandion

+0

@meder - haha, 'alert' является самым громким из всех :) – Anurag

ответ

2

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

Сайт Log4js также предоставляет list of other JavaScript logging frameworks.

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

2

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

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

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

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