Сообщение об ошибке при обходе от firefox

Я не могу найти способ поймать сообщение об ошибке в firefox:

window.addEventListener("error", handleException, false);

...

function handleException(e) {   
    alert(e);
    return false;
}

...

<script>
throw new Error('sdasd');
</script>

Это очень хорошо относится к методу handleException, однако параметр e является error event под firefox , и я не знаю, как получить связанное сообщение. Например, в chrome я получаю либо сообщение через e.message, потому что после того, как ошибка выйдет из строя, чтобы не быть пойманной, на уровне окна появилась автоматическая ошибка (см. эта скрипка: окончательная ошибка "Недоступна" ), которая содержит исходную ошибку, которую я поднял вручную.

Итак, чтобы иметь такое же поведение в firefox (если вы запустите скрипт под firefox, вы увидите, что сообщение "undefined" ). Я нашел обходное решение, состоящее в инкапсуляции функции повышения ошибок для установки руководства "последний error":

function err(I_sText) { 
    g_lastManualError = new Error(I_sText);
    throw g_lastManualError; //this variable is global so I can get the message from anywhere
}

Поэтому вместо выполнения throw new Error(..) я вызываю только err(..). Это работает, по крайней мере, для пользовательских исключений, которые являются моей самой большой проблемой. В моем обработчике handleException я консультирую глобальную переменную.

Вы знаете, как я мог бы сделать иначе? Я не доволен этим решением.

Спасибо, S.

Ответ 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 в пользовательских событиях в качестве ссылки.