Sentry-javascript: Автоматически регистрировать все выброшенные ошибки?

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

Есть ли способ заставить Raven регистрировать все выброшенные ошибки? По какой-то причине он регистрирует некоторые вызовы throw , но не другие. Я обнаружил, что он, как правило, не регистрирует поведение, вложенное дальше по стеку вызовов.

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

Ну вот:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

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

ха-ха, обработка ошибок в Javascript действительно ужасна. Можете ли вы привести мне пример того, как вы выдаете ошибки?

Например, выбрасывание строки не позволяет нам получить никакой информации, кроме отправленного сообщения. С реальным объектом Error мы можем (попытаться) получить стек.

Так что чем больше информации, тем лучше для этого.

Конечно.

Я выбрасываю ошибку следующим образом:

throw new Error("Error");

Иногда он входит в систему sentry, а иногда нет.

Это на странице, где я могу взглянуть на где-нибудь? Или можно куда-нибудь поставить? Честно говоря, информации мало. Существует около 10 факторов, которые могут повлиять на то, почему ошибка не регистрируется, и большинство из них не зависят от нас. :) Так что, если я смогу увидеть полный контекст, я могу дать вам предложение помочь браузеру.

Приложение на самом деле написано на CoffeeScript, который компилируется в JavaScript с помощью require.js. Основная точка входа выглядит так:

Raven.config('http://[email protected]');
Raven.context(function() {
  define(['cs!csmain']);
});

Я пробовал и без оболочки context , и это, похоже, ничего не изменило. Он по-прежнему регистрировал throw вызовов, которые были сделаны выше в стеке вызовов, игнорируя при этом те, что ниже.

Вы бежите Raven.install()

А для require.js, если вы явно хотите обернуть модули, вы должны сделать:

define(['module'], Raven.wrap(function(module) {
  // insert cool stuff here
}));

Я забыл это во фрагменте, но я звоню install() после config()

Я не пробовал оборачивать модули, но подумал, что если в некоторых местах это уже работает, то почему нет в других?

Все действительно зависит от стека вызовов. Когда дело доходит до асинхронности, становится тяжело. Например, это не будет работать так, как ожидалось:

Raven.context(function() {
  setTimeout(function() {
    throw new Error('crap');
  }, 1);
});

Внутренняя функция запускается в своем собственном контексте вне основного контекста. Node.js решает эту проблему с помощью так называемых «доменов», но, к сожалению, их нет в браузерах.

Поэтому, если ошибка не обнаружена и всплывает наверху, она обычно отклоняется, потому что в этот момент она на 100% бесполезна.

Ах я вижу. Возможно, есть способ использовать window.onerror ?

FWIW, если это возможно, наиболее надежный способ захвата исключения — это явное использование Raven.captureException . Я понимаю, что это не всегда возможно, но просто для справки.

Таким образом, явный блок try...except является наиболее надежным:

try {
  throw new Error('something');
} catch(e) {
  Raven.captureException(e);
}

Верно. Конечно, было бы здорово автоматически фиксировать ошибки, но JavaScript не делает игру легкой для игры...

@pheuter Нет. :) И это самое интересное. Как только ошибка попадает в window.onerror, она больше не является фактическим объектом Error . Он превращается в бесполезную строку. И это также накладывает проблемы междоменной безопасности. Таким образом, как только ошибка достигает window.onerror , она обычно отбрасывается, поскольку единственная информация, которая у нас есть, может быть только: "Script error." .

Отстой. О, хорошо, я ценю разъяснения!

Нет, Javascript не поддерживает. Это действительно ужасно, на самом деле. :) Я активно изучаю и изучаю способы использования браузера для получения более качественной информации. Мне даже пришла в голову идея сделать мартышкиный патч Function.prototype.call . Но это, наверное, очень плохие новости.

Полностью! Если у вас есть какие-либо рекомендации или предложения по уточнению документации, пожалуйста, дайте мне знать. Я всегда ищу этот материал.

Сойдет, документы по настройке и использованию были довольно простыми и понятными.

Интересно, есть ли способ расширить Error , чтобы это работало.

@mattrobenolt , это подход, который мы используем, используя CoffeeScript.

window.Error = class extends Error
  constructor: ->
    error = super
    Raven.captureException error
    return error

Тогда просто используйте throw new Error "Test Error"

Обновлен комментарий выше для уточнения.

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

Спасибо за наводку!

Кроме того, вы можете дать мне это в обычном Javascript? Я почти уверен, что он делает, я просто хочу перепроверить. Я не пишу Кофескрипт.

Ну вот:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

Теперь, когда я думаю об этом, это ошибочный подход. Простое переопределение конструктора приведет к тому, что Raven будет захватывать каждый объект ошибки, вне зависимости от того, выброшен он или нет. :)

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

@dmcquay Можете ли вы привести пример, который фиксирует Errorception? Я, вероятно, могу перепроектировать это.

Я действительно предполагаю, что все обработчики ошибок JS на 50% состоят из raven.js;)

:какать:

@BYK , есть идеи?

У меня нет никаких внутренних знаний об ошибочном восприятии. Я использую сервис, и он, кажется, работает так, как рекламируется. Это все, что я знаю.

Я проверил, как они работают, и похоже, что они просто присоединяются к window.onerror и не заботятся о трассировке стека. По крайней мере, для таких вещей.

Перехват объекта Error работает для Firefox, но точка зрения @mattrobenolt о захвате всех их, даже тех, которые не были выброшены, является обоснованной проблемой.

Грязным обходным путем для этого может быть сохранение созданных экземпляров Error путем захвата глобального конструктора, а также прослушивание onerror и сравнение message , fileName и lineNo Аргументы

Оценивая все службы уведомления об ошибках, я заметил, что некоторые службы, специфичные для Javascript (например, https://qbaka.com/), отслеживают трассировку стека и отображают действия пользователя, которые привели к конкретной ошибке. Жаль, что ошибочное восприятие не делает этого, поскольку во всех остальных отношениях оно кажется лучше.

Мы будем использовать Sentry для нашего кода Django, и я наткнулся на эту проблему, когда искал информацию о том, как Sentry работает с Javascript. Требует ли текущая реализация raven-js, чтобы код явно перехватывал все ошибки JS и сообщал о них в Sentry?

@adityar7 Это не так. Raven.js старается изо всех сил исправлять и перехватывать вещи, если это возможно. В некоторых других крайних случаях вам может потребоваться явный перенос, но мы очень стараемся, чтобы все происходило автоматически.

@mattrobenolt Заработало , исправив кое-какой синтаксис. Спасибо!

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