Ingernirated
@Ingernirated
Романыч

Как в js работает SyntaxError в throw?

Как правильно задать SyntaxError или где его увидеть?
Или как работает throw ... new error? (не совсем понял этот момент в статье)
var x = 13;
var z;
	function move() {
	z = x + y;
	return z;
	}
	try {
	move();
	if (!y || !x || !z) {
		throw new Error("не хватает данных"); 
	}
	}
	catch(e) {
		alert("function move doesnt work");
	}
	document.write("size");
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
Ivanq
@Ivanq
Знаю php, js, html, css
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(), если мы не уверены, что данных хватает - так мы проверяем, что входные и выходные данные правильные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы