Есть ли способ заставить Raven регистрировать все выброшенные ошибки? По какой-то причине он регистрирует некоторые вызовы throw
, но не другие. Я обнаружил, что он, как правило, не регистрирует поведение, вложенное дальше по стеку вызовов.
ха-ха, обработка ошибок в 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 Заработало , исправив кое-какой синтаксис. Спасибо!
Самый полезный комментарий
Ну вот: