throw new Error(...);
бросает
исключение - что-то типа сигнализатора ошибки. Когда выбрасывается исключение, исключительную ситуацию нужно как-то обработать.
Обычно ошибка выводится в консоль, а функция, ее caller, caller caller'а и т. д. завершают работу, так как данные испорчены и обрабатывать их нет смысла.
------------------------------------
try ------------------------------------
Однако иногда нужно обработать ошибку иначе.
try { // Пробуем (try) исполнить код
move();
// Код, который может выбросить исключение
} catch(e) { // Ловим (catch) исключение, если оно было выброшено, записываем его в e (можно любую переменную, но к e все уже привыкли)
alert("ERROR");
// Выводим ошибку или обрабатываем ее еще как-то
}
Стоит добавить, что после
catch(e)
можно написать
finally
- код, который будет выполнен, и если код выполнился, и если упал с ошибкой
try { // Пробуем (try) исполнить код
move();
// Код, который может выбросить исключение
} catch(e) { // Ловим (catch) исключение, если оно было выброшено, записываем его в e (можно любую переменную, но к e все уже привыкли)
alert("ERROR");
// Выводим ошибку или обрабатываем ее еще как-то
} finally {
alert("It worked (or didn't :) )");
}
------------------------------------
throw ------------------------------------
Мы можем бросить ошибку с помощью оператора
throw
, для этого ему передается исключение
(или строку, или число, или другой объект, но лучше иключение). Потом брошенное исключение можно поймать с помощью
try
.
Кстати, бросать исключение можно и внутри
catch
, тогда оно перейдет к следующему
catch
- это называется
проброс исключений. Например:
function doThat() {
try {
a();
} catch(e) {
if(e instanceof TypeError) { // Если выброшено исключение TypeError, то
alert("TypeError!"); // написать TypeError!
} else { // Иначе
throw e; // doThat() не знает, как обрабатывать другие типы исключений, передаем дальше
}
}
}
// ...
try {
doThat(); // Если a() выбросит TypeError, catch в doThat() его обработает
} catch(e) { // doThat() пробросил исключение дальше
alert("Some other error!");
}
------------------------------------
Код в примере ------------------------------------
Мне кажется,
move();
if (!y || !x || !z) {
throw new Error("не хватает данных");
}
стоит переписать так:
if (!x || !y) {
throw new Error("не хватает входных данных");
}
move();
if (!z) {
throw new Error("не хватает выходных данных");
}
Лучше не вызывать
move()
, если мы не уверены, что данных хватает - так мы проверяем, что входные и выходные данные правильные.