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(), если мы не уверены, что данных хватает - так мы проверяем, что входные и выходные данные правильные.