Исключения в JavaScript

В этой главе:

  • Конструкция try-catch

  • Блок finally

  • Оператор throw

  • Throw или try-catch

Конструкция try-catch

Исключение - сигнал, указывающий на возникновение какой-либо исключительной ситуации или ошибки. В JavaScript исключения возникают только в случае ошибки времени выполнения или при явном вызове с помощью инструкции throw. Конструкция try-catch используется как способ обработки исключений, рассмотрим ее базовый синтаксис:

1
2
3
4
5
6
try {
  //код, приводящий к ошибке
}
catch(ошибка) {
  //действия при обнаружение ошибки
}

Любой код, который может вызвать ошибку, помещается в блок try, а код, который будет обрабатывать найденную ошибку, помещается в блок catch. Если ошибка возникает в любой точке блока try, выполнение кода в нем немедленно прекращается и передается в блок catch, который в качестве единственного параметра получает объект, содержащий сведения о возникшей ошибке (имя для объекта вы должны определить сами, даже если не намерены его использовать). В зависимости от браузера, информация, которой обладает объект, может отличатся, но он всегда имеет свойство message, которое выводит сообщение об ошибке.

1
2
3
4
5
6
7
8
9
try {
  var number = 10;
  alert(namber);
}
catch(error) {
  // наше действие на обнаружение ошибки
  alert("Упс, мы неправильно указали имя переменной!");
  alert(error.message);  // сообщение сгенерированное браузером
}

В примере мы используем свойство message при отображение сообщения об ошибке, оно является кроссбраузерным.

Блок finally

К конструкции try-catch можно добавить еще один блок, который будет выполняться всегда. В отличае от блока catch, который выполняется только при возникновении исключения в блоке try, блок finally будет выполнятся и при возникновении исключения, сразу после блока catch, и без исключения, сразу после того, как блок try завершит выполнение.

Оператор throw

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

1
2
3
4
throw 12345;
throw “Привет!”;
throw true;
throw { name: “JavaScript”};

При использовании оператора throw выполнение кода незамедлительно останавливается и переходит к конструкции try - catch, которая ловит переданное значение.

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

1
2
3
4
5
6
7
8
9
function process(values) {
  values.sort();
  for (var i=0, len=values.length; i < len; i++) {
    if (values[i] > 100) {
      return values[i];
    }
  }
  return -1;
}

Если не вызвать исключение явно с помощью throw, то каждый браузер выведет свое сообщение об ошибке, ни одно из которых не даст ясного ответа, почему функция не работает должным образом. При работе с одной функцией, как в нашем примере, отладка кода не займет много времени даже с такими сообщениями об ошибке, однако когда вы работаете со сложными веб-приложениями с тысячами строк кода на JavaScript, то найти источник ошибки становится гораздо труднее. Для этого в больших сценариях лучше стоит вызвать ошибки с соответствующей информацией, которая упростит отладку кода.

1
2
3
4
5
6
7
8
9
10
11
12
function process(values) {
  if (!(values instanceof Array)) {
    throw new Error(“process(): Аргумент должен быть массивом.”);
  }
  values.sort();
  for (var i=0, len=values.length; i < len; i++) {
    if (values[i] > 100) {
      return values[i];
    }
  }
  return -1;
}

В этой переписанной версии функции возникает ошибка при передачи не корректного аргумента. Наше сообщение об ошибке содержит имя функции и четкое описание того, почему возникла ошибка. Если эта ошибка произойдет в сложном веб-приложении, то вы будете иметь гораздо более четкое представление о том, где возникла реальная проблема.

Throw или try-catch

Если у вас возникает вопрос, когда стоит инициировать ошибку и в каком случае использовать конструкцию try-catch, то для начала стоит разобраться в каких случаях что лучше применять.

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

Использовать конструкцию try-catch лучше в том месте, где нужно не только перехватить исключение, возникшее при выполнении кода, но и обработать его (т.е. когда вы знаете, что нужно сделать при возникновении ошибки). Чаще всего конструкция try-catch не используется при написании своего кода, а применяется для кода подключаемого из вне ( например: библиотека ), когда вы знаете что в коде может сгенерироваться исключение, но не хотите чтобы при этом программа немедленно прервала свое нормальное выполнение.