Ответ 1
Я немного изменил ваш код как демонстрацию:
function handleException(e) {
console.log(e);
alert(e);
return false;
}
window.addEventListener("error", handleException, false);
try {
throw new Error('sdasd');
}
catch (e) {
console.log(e)
}
console.log('after exception 1');
throw new Error('foo');
console.log('after exception 2');
Запуск этого кода (в Firebug) показал мне это:
Error: sdasd
[Break On This Error]
Filtered chrome url chrome://firebug/content/console/commandLineExposed.js
comman...osed.js (line 175)
<System>
after exception 1
"Error: foo ` throw new Error('foo');` @14"
Если вы пытаетесь поймать ошибку, используйте try {...} catch { ...}
. Похоже, вы просто привязываетесь к событию с ошибкой, поэтому исключение, которое вы бросаете, по-прежнему будет распространяться до окна и будет останавливать работу механизма JS. Запустите этот код в Chrome, вы увидите, что никогда не видите "после исключения 2", но вы увидите "после исключения 1".
Цель исключений (созданных throw
) заключается в том, чтобы остановить выполнение кода, если только код не создан для обработки этого конкретного исключения. Вы можете увидеть пример на странице MDN для try-catch
Изменить: мне просто пришло в голову, что вы можете попытаться поймать событие ошибки jQuery. Если это так, привязка к событию верна, но вы не должны ее тестировать с помощью throw
Изменить 2. Я должен был заметить это раньше, но вы пытаетесь прослушать событие с ошибкой DOM с помощью window.addEventListener
. События с ошибкой не прерывают выполнение. Исключения сделаны.
Замените код throw new Error('sdasd');
на этот код:
var customEvent = new CustomEvent('error')
window.dispatchEvent(customEvent);
Это должно решить вашу проблему. Я использовал страницу MDN в пользовательских событиях в качестве ссылки.