Поймать пользовательское исключение JavaScript с помощью window.onerror - в IE - PullRequest
4 голосов
/ 18 ноября 2009

У меня есть собственный класс исключений, который я использую для конкретной ситуации. Его можно бросить откуда угодно, поэтому попытка / отлов не очень полезна.

throw new CustomException;

Я хочу отловить эту ошибку в window.onerror и отфильтровать ее, что прекрасно работает в большинстве браузеров, которые я тестировал до сих пор.

var window_onerror = window.onerror || function() {return false;};
window.onerror = function(message, url, line)  {
  if (message.match(CustomException.prototype.name)) {
    return true;
  } else {
    return window_onerror(message, url, line);
  }
};

Однако в IE функция window.onerror получает Exception thrown and not caught вместо моего пользовательского исключения.

Ответы [ 3 ]

2 голосов
/ 19 ноября 2009

У нас есть универсальный обработчик исключений, который мы используем на Exceptioneer.com, однако каждый браузер ведет себя по-разному и по-разному сообщает об одних и тех же исключениях.

Кроме того, разные локализованные версии браузера действуют по-разному, напримерЯ видел ошибки Javascript на русском языке от некоторых наших пользователей - не самая простая в мире вещь для анализа.

Этот скрипт позволит вам увидеть, как разные браузеры реагируют на ошибки: -

window.onerror = function(message, uri, line) {
    var fullMessage = location.href + '\n' + uri + '\n' + line;
    alert(fullMessage);
    return false;
}

Спасибо,

Фил.

1 голос
/ 19 апреля 2019

Объявить глобальную переменную и некоторые перечисления ..

var errorCode;
const ErrCustomException = 1, ... ;

Поставьте строку перед вашим исключением броска ..

errorCode = ErrCustomException;
throw new CustomException;

Измените условие на это ..

window.onerror = function(message, url, line)  {
  if (errorCode == ErrCustomException) {
    return true;
  } else {
    return window_onerror(message, url, line);
  }
};
1 голос
/ 18 ноября 2009

Я не знаю ни одного способа получить брошенный объект в обработчике onerror. В качестве обходного пути я предлагаю выдать общую ошибку времени выполнения с пользовательским сообщением, например

throw new Error('foo')

и чек

message === 'foo'

внутри функции обработчика.

edit: рабочий пример кода:

window.onerror = function(message, url, line)  {
    alert(message === 'foo');
    return true;
};

throw new Error('foo');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...