Ну, поскольку JavaScript выполняется на стороне клиента, я не могу контролировать кучу переменных среды, и в какой-то момент мое приложение, вероятно, выдаст исключение.
Что я хочу сделать, так это получить это исключение и заставить мое приложение корректно выйти из строя и показать конечному пользователю максимум информации, насколько это возможно (мои конечные пользователи - технические). Очевидно, что обработка ошибок может быть выполнена с помощью простого блока try ... catch.
Меня беспокоит следующее: как я могу узнать, какая информация хранится в собственном исключении, пойманном блоком catch
?
Я предполагаю, что собственные исключения, создаваемые JS-движком браузера, являются просто объектами из классов Error
, например, при запуске этого кода:
try {
a;
} catch (ex) {
console.log(ex);
console.log(new ReferenceError("`Custom` error"));
}
У меня такая же структура:
ReferenceError: a is not defined
at http://stacksnippets.net/js:14:3
ReferenceError: `Custom` error
at http://stacksnippets.net/js:17:15
Ну, console.log
обычного объекта немного отличается от этого, но, предполагая, что переменная ex
является объектом, я мог бы пройти через него с помощью _ 7_, верно?
Ну нет.
Этот код не показывает ничего в журнале:
try {
a;
} catch (ex) {
for (prop in ex) {
console.log(prop, ": ", ex[prop]);
}
}
Итак, мой вопрос: Как я могу получить всю информацию, хранящуюся в исключении собственного JavaScript?
Да, я знаю, что могу получить доступ к свойствам напрямую с помощью ex.name
, ex.description
, ex.message
, ex.stack
и так далее, но я бы хотел этого избежать. Некоторые браузеры могут реализовать что-то, чего нет в других браузерах, поэтому мне будет не хватать некоторой информации при запуске в первом (как вы можете видеть по этот вопрос, например, свойство stack
впервые было реализовано в Firefox).
И, если кто-то может объяснить, я хотел бы понять, какова реальная природа исключений JavaScript (являются ли они объектами? Почему они выглядят так по-разному в консоли?) И почему я не могу выполнить цикл с помощью for .. .in block (вероятно, ответы очень связаны).
Спасибо.