Sentry-javascript: Свойство сообщения об ошибке регистрируется как [объект ErrorEvent]

Созданный на 7 авг. 2017  ·  31Комментарии  ·  Источник: getsentry/sentry-javascript

Вы хотите запросить функцию или сообщить об ошибке ?
Ошибка.

Каково текущее поведение?
Иногда (не всегда) свойство message ошибки регистрируется как [object ErrorEvent] . Я следовал стандартной реализации Raven в Angular, как описано здесь: https://docs.sentry.io/clients/javascript/integrations/angular/.

Какое ожидаемое поведение?
Чтобы увидеть нормальное сообщение об ошибке.

Ворон 3.17.0
Угловой 4.3.1
Сборка Webpack
Не использую CLI
Версия CDN

objecterrorevent

Help Wanted Needs Reproduction Bug

Самый полезный комментарий

Я нашел проблему. ErrorEvent не обрабатывается как ошибка функцией isError util, которую можно найти здесь . Для удобства я также вставлю определение функции:

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

Я быстро проверил в своей консоли, вернет ли эта функция true для ErrorEvent , но этого не произошло:

image

isError используется в методе captureException чтобы определить, является ли параметр исключения ошибкой или просто сообщением. captureException будет отправлять исключения на панель управления с помощью captureMessage если считает, что исключение не _на самом деле_ ошибка. В этом случае Raven не будет вычислять трассировку стека или «обрабатывать» исключение. Он просто отправляет его как есть.

Есть ли причина, по которой мы не должны обновлять isError чтобы возвращать true для ErrorEvent объектов?

Все 31 Комментарий

Есть ли где-нибудь в документации по Angular определение ErrorEvent ? Очевидно, это не "наследование" Error правильным образом.

Проблема может быть в методе traceKitWindowOnError() TraceKit, похоже, не учитывается, что аргумент message может быть ErrorEvent (см. Документацию MDN )

@benvinegar Здесь есть несколько документов на ErrorEvent : https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent

Это также коснется следующих пользователей:
https://forum.sentry.io/t/reporting-object-errorevent/1807

[email protected] (но некоторое время происходило и в старых версиях)
Угловой 4.x
Использование CLI

То же самое здесь с Ionic 3 и [email protected]

<script>
  undefined.foo();
</script>

^ Это в вашем html регистрируется в сафари через часовую как [object ErrorEvent] . Правильное сообщение было бы TypeError: undefined is not an object (evaluating 'undefined.foo') .

У нас есть внешний скрипт, который вводит код через тег скрипта, который пытается создать iframe, но он заблокирован сафари. Поскольку ошибка возникает из-за введенного тега сценария, sentry просто сообщает [object ErrorEvent]

Другая ошибка от часового сообщается как [object Event] от flowplayer. Flowplayer делает

jQueryElement.trigger('error', [api, {code: 5}]);

Вы можете воспроизвести это, встроив jQuery и просто сделав:

$('div:first').trigger('error')

Sentry видит что-то подобное
image

Конечно, это не очень сериализуемый, но ошибка типа error on element from jQuery - context <div class="foo><div class="bar" ... была бы намного полезнее, чем [object Event]

Также затронуто это.

@daangeerdink @jdelaune @rosslavery @tgensol Может ли кто-нибудь предоставить минимально возможный код, который мог бы помочь мне воспроизвести это?

@sod Я только что проверил, и Safari 10.1.2

screen shot 2017-09-18 at 14 42 47

Я лично не могу предоставить репро, потому что ошибки настолько непрозрачны, что я не могу различить, какая часть моей кодовой базы вызывает ошибку. У меня нет трассировок стека, с которыми можно было бы работать, ни сообщения об ошибке, чтобы выяснить, мой ли это код, сторонняя библиотека и т. Д.

Надеюсь, у кого-то есть упрощенный пример, который они могут предоставить, извините, я ничем не могу помочь.

У нас тоже есть эта проблема. Могу поделиться некоторыми данными за последние 10 дней (22k ​​событий этого типа, 13k пользователей). Надеюсь, это поможет вам воспроизвести это.
image

image

image

@kamilogorek У нас 2 миллиона ошибок такого типа. Я думал, что это наша проблема, но мы не смогли правильно ее отследить.

Я нашел проблему. ErrorEvent не обрабатывается как ошибка функцией isError util, которую можно найти здесь . Для удобства я также вставлю определение функции:

function isError(value) {
  switch ({}.toString.call(value)) {
    case '[object Error]':
      return true;
    case '[object Exception]':
      return true;
    case '[object DOMException]':
      return true;
    default:
      return value instanceof Error;
  }
}

Я быстро проверил в своей консоли, вернет ли эта функция true для ErrorEvent , но этого не произошло:

image

isError используется в методе captureException чтобы определить, является ли параметр исключения ошибкой или просто сообщением. captureException будет отправлять исключения на панель управления с помощью captureMessage если считает, что исключение не _на самом деле_ ошибка. В этом случае Raven не будет вычислять трассировку стека или «обрабатывать» исключение. Он просто отправляет его как есть.

Есть ли причина, по которой мы не должны обновлять isError чтобы возвращать true для ErrorEvent объектов?

Есть ли причина, по которой мы не должны обновлять isError, чтобы возвращать true для объектов ErrorEvent?

Да. Потому что на самом деле это не потомок Error (это потомок Event ). Например, у него нет свойства stack (AFAICT, игра в консоли). Это означает, что на самом деле он может не обрабатываться правильно.

Было бы здорово увидеть пример того, как эта ошибка генерируется вживую, чтобы мы могли понять, как лучше всего ее обработать.

Конструктор для ErrorEvent принимает Error , поэтому вы можете легко обработать их следующим образом:

if (isErrorEvent(ex)) {
    ex = ex.error;
}

Вы можете увидеть определение конструкции здесь . В частности, посмотрите на хеш ErrorEventInit . Это необязательный параметр, поэтому я предполагаю, что решение, которое я опубликовал выше, не обрабатывает случай, когда ErrorEvent.error не определено.

Конечно, я считаю, что это можно решить - я просто имел в виду, что это не так просто, как просто увеличить isError чтобы вернуть true .

Я понимаю. Я сделаю пиар через несколько минут.

Исправлено в 3.19.x

Спасибо @shcallaway! 👍

Похоже, мы все еще получаем эту проблему на 3.19.1 🤔
image
image

@PhilippSpo, в каком браузере происходит это мероприятие? ErrorEvent не поддерживается в некоторых старых мобильных браузерах и IE, поэтому нам пришлось вернуться к обычному решению.

@kamilogorek Chrome 61.0.3163

Я тоже вижу это в Chrome 61. 😕 Я постараюсь в ближайшее время разобраться с этим.

Спасибо @shcallaway

Также происходит в Safari 11.0, Mac OS 10.13

Похоже, traceKitWindowOnError некорректно обрабатывает входные параметры, когда параметр message является объектом ErrorEvent:
screen shot 2017-11-06 at 11 36 34
и ex не определено. Затем он вызывает notifyHandlers с объектом, где поле message является ErrorEvent, а не строкой:
screen shot 2017-11-06 at 11 41 14
который при стригении в _makeRequest выдает бессмысленное сообщение.

Спасибо за расследование @ michal-rumanek, в ближайшее время постараюсь разобраться с этой проблемой (на этой неделе нет свободного времени).

@kamilogorek , прогресс есть? ;-)

Привет, я получаю много таких ошибок [object Object] .
screenshot 2017-12-01 09 41 20

Угловой 4
Хром 62.0.3202
Raven-js 3.20.1

Была ли эта страница полезной?
0 / 5 - 0 рейтинги