Sentry-javascript: Propriedade da mensagem de erro registrada como [objeto ErrorEvent]

Criado em 7 ago. 2017  ·  31Comentários  ·  Fonte: getsentry/sentry-javascript

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

objecterrorevent

Help Wanted Needs Reproduction Bug

Comentários muito úteis

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:

image

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?

Todos 31 comentários

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
image

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.

screen shot 2017-09-18 at 14 42 47

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.
image

image

image

@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:

image

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 🤔
image
image

@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:
screen shot 2017-11-06 at 11 36 34
e 'ex' é indefinido. Em seguida, ele chama notificarHandlers com um objeto em que o campo 'mensagem' é um ErrorEvent, não uma string:
screen shot 2017-11-06 at 11 41 14
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] .
screenshot 2017-12-01 09 41 20

Angular 4
Chrome 62.0.3202
Raven-js 3.20.1

Esta página foi útil?
0 / 5 - 0 avaliações