Você quer solicitar um recurso ou relatar um bug ?
Erro.
Qual é o comportamento atual?
Às vezes (nem sempre) a propriedade message
do erro é registrada como [object ErrorEvent]
. Segui a implementação padrão do Raven no Angular conforme descrito aqui: https://docs.sentry.io/clients/javascript/integrations/angular/.
Qual é o comportamento esperado?
Para ver uma mensagem de erro normal.
Raven 3.17.0
Angular 4.3.1
Webpack build
Não usando CLI
Versão CDN
Existe uma definição de ErrorEvent
em algum lugar nos documentos do Angular? Aparentemente, isso não é "herdar" Error
da maneira certa.
O problema pode estar no método traceKitWindowOnError()
do TraceKit, ele não parece levar em consideração que o argumento message
pode ser um ErrorEvent
(consulte os documentos MDN )
@benvinegar Existem alguns documentos aqui em ErrorEvent
: https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent
Afetados por isso também são estes usuários:
https://forum.sentry.io/t/reporting-object-errorevent/1807
[email protected] (mas tem acontecido por um tempo nas versões mais antigas também)
Angular 4.x
Usando CLI
O mesmo aqui com Ionic 3 e [email protected]
<script>
undefined.foo();
</script>
^ Isto em seu html é registrado no safari via sentinela como [object ErrorEvent]
. A mensagem correta seria TypeError: undefined is not an object (evaluating 'undefined.foo')
.
Temos um script externo que injeta código via tag de script que tenta criar um iframe, mas está bloqueado pelo safari. Como o erro se origina da tag de script injetada, o sentinela apenas relata [object ErrorEvent]
Outro erro do sentinela relatado como apenas [object Event]
é do flowplayer. O flowplayer faz
jQueryElement.trigger('error', [api, {code: 5}]);
Você pode reproduzi-lo incorporando jQuery e apenas fazer:
$('div:first').trigger('error')
Sentinela vê algo assim
Claro que não é muito serializável, mas um erro como error on element from jQuery - context <div class="foo><div class="bar" ...
seria muito mais útil do que [object Event]
Também afetado por isso.
@daangeerdink @jdelaune @rosslavery @tgensol alguém poderia fornecer o menor código possível que pudesse me ajudar a reproduzi-lo?
@sod Acabei de verificar e o Safari 10.1.2 está fornecendo a mensagem correta no cenário que você mencionou acima.
Eu pessoalmente não posso fornecer uma reprodução, porque os erros são tão opacos que não consigo discernir qual parte da minha base de código está gerando o erro. Não tenho nenhum rastreamento de pilha para trabalhar, nem uma mensagem de erro para descobrir se é meu código ou uma biblioteca de terceiros, etc.
Espero que outra pessoa tenha um exemplo simplificado que possa fornecer, desculpe, eu não pude ajudar mais.
Também estamos tendo esse problema. Posso compartilhar alguns dados dos últimos 10 dias (22 mil eventos desse tipo, 13 mil usuários). Espero que ajude você a reproduzi-lo.
@kamilogorek Temos 2 milhões de erros desse tipo. Achei que fosse nosso problema, mas não conseguimos rastreá-lo corretamente.
Eu encontrei o problema. ErrorEvent
não está sendo tratado como um erro pela função isError
util, que pode ser encontrada aqui . Por conveniência, colarei a definição da função também:
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;
}
}
Fiz um teste rápido em meu console para ver se essa função retornaria verdadeiro ou não para ErrorEvent
, e não:
isError
é usado no método captureException
para determinar se o parâmetro de exceção é um erro ou simplesmente uma mensagem. captureException
enviará exceções ao painel usando captureMessage
se achar que a exceção não é _atualmente_ um erro. Nesse caso, o Raven não computará um rastreamento de pilha ou "processará" a exceção. Apenas envia como está.
Existe alguma razão pela qual não devemos atualizar isError
para retornar true para ErrorEvent
objetos?
Existe alguma razão pela qual não devemos atualizar isError para retornar true para objetos ErrorEvent?
Sim. Porque na verdade não é descendente de Error
(é descendente de Event
). Ele não tem uma propriedade stack
, por exemplo (AFAICT, brincando no console). O que significa que pode não ser processado corretamente.
Seria ótimo ver um exemplo de como esse erro é gerado ao vivo, para que possamos descobrir a melhor forma de processá-lo.
O construtor de ErrorEvent
pega um Error
, então você pode facilmente manipulá-los assim:
if (isErrorEvent(ex)) {
ex = ex.error;
}
Você pode ver a definição de construção aqui . Em particular, observe o hash ErrorEventInit
. É um parâmetro opcional, então acho que a solução que postei acima não lida com o caso em que ErrorEvent.error
é indefinido.
Claro, acredito que isso pode ser resolvido - eu apenas quis dizer que não é tão simples quanto apenas aumentar isError
para retornar true
.
Compreendo. Vou colocar um PR em alguns minutos.
Fixo em 3.19.x
Obrigado @shcallaway! 👍
Parece que ainda estamos tendo esse problema em 3.19.1
🤔
@PhilippSpo de qual navegador esse evento está vindo? ErrorEvent
não é compatível com alguns navegadores móveis antigos e IE, portanto, tivemos que voltar para a solução normal.
@kamilogorek Chrome 61.0.3163
Também estou vendo no Chrome 61. 😕 Vou tentar investigar isso em breve.
Obrigado @shcallaway
Também acontece no Safari 11.0, Mac OS 10.13
Parece que traceKitWindowOnError não processa corretamente os parâmetros de entrada quando o parâmetro 'mensagem' é um objeto ErrorEvent:
e 'ex' é indefinido. Em seguida, ele chama notificarHandlers com um objeto em que o campo 'mensagem' é um ErrorEvent, não uma string:
que, quando estrigificado em _makeRequest , produz mensagem sem sentido.
Obrigado pela investigação @ michal-rumanek, tentarei resolver este problema em breve (não tenho tempo livre esta semana).
@kamilogorek , algum progresso? ;-)
Olá, estou recebendo muitos desses erros [object Object]
.
Angular 4
Chrome 62.0.3202
Raven-js 3.20.1
Corrigido em https://github.com/getsentry/raven-js/pull/1162
Comentários muito úteis
Eu encontrei o problema.
ErrorEvent
não está sendo tratado como um erro pela funçãoisError
util, que pode ser encontrada aqui . Por conveniência, colarei a definição da função também:Fiz um teste rápido em meu console para ver se essa função retornaria verdadeiro ou não para
ErrorEvent
, e não:isError
é usado no métodocaptureException
para determinar se o parâmetro de exceção é um erro ou simplesmente uma mensagem.captureException
enviará exceções ao painel usandocaptureMessage
se achar que a exceção não é _atualmente_ um erro. Nesse caso, o Raven não computará um rastreamento de pilha ou "processará" a exceção. Apenas envia como está.Existe alguma razão pela qual não devemos atualizar
isError
para retornar true paraErrorEvent
objetos?