Как я могу извлечь ВСЮ информацию о собственном исключении JavaScript?

Ну, поскольку 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 (вероятно, ответы очень связаны).

Спасибо.


person Dinei    schedule 17.06.2015    source источник


Ответы (1)


Я хотел бы понять, какова реальная природа исключений JavaScript (являются ли они объектами? Почему они так по-разному выглядят в консоли?)

Исключения Javascript - это обычные объекты JavaScript. Вы можете увидеть определение объекта здесь

и почему я не могу зациклить его с помощью блока for ... in (вероятно, ответы очень связаны).

Итерация свойств ошибки с использованием for (prop in ex) { не работает, поскольку свойства не помечены как перечислимые (это также показано в приведенном ниже фрагменте кода путем печати дескриптора свойства)

Вы можете переключиться на использование getOwnPropertyNames чтобы перечислить все свойства.

В приведенном ниже коде показано, как это можно использовать - не уверен, можно ли использовать getOwnPropertyNames & ex[property] таким образом, но это возможное решение.

function propsToStr(obj) {
  var str = '';
  for (prop in obj) {
    str += prop + "=" + obj[prop] + ",";
  }
  return str;
}

try {
  a;
} catch (ex) {
  console.log(ex);
  var propertyNames = Object.getOwnPropertyNames(ex);
  propertyNames.forEach(function(property) {
    var descriptor = Object.getOwnPropertyDescriptor(ex, property);
    console.log(property + ":" + ex[property] + ":" + propsToStr(descriptor));
  });
}

person 6ton    schedule 17.06.2015