Sentry-javascript: Fehlermeldungseigenschaft protokolliert als [Objekt ErrorEvent]

Erstellt am 7. Aug. 2017  ·  31Kommentare  ·  Quelle: getsentry/sentry-javascript

Möchten Sie eine Funktion anfordern oder einen Fehler melden?
Fehler.

Wie ist das aktuelle Verhalten?
Manchmal (nicht immer) wird die Eigenschaft message des Fehlers als [object ErrorEvent] protokolliert. Ich folgte der Standardimplementierung von Raven in Angular wie hier beschrieben: https://docs.sentry.io/clients/javascript/integrations/angular/.

Was ist das erwartete Verhalten?
Eine normale Fehlermeldung anzeigen.

Rabe 3.17.0
Winkel 4.3.1
Webpack bauen
CLI wird nicht verwendet
CDN-Version

objecterrorevent

Help Wanted Needs Reproduction Bug

Hilfreichster Kommentar

Ich habe das Problem gefunden. ErrorEvent wird von der Funktion isError util, die hier zu finden ist, nicht als Fehler behandelt. Der Einfachheit halber füge ich auch die Funktionsdefinition ein:

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;
  }
}

Ich habe in meiner Konsole einen kurzen Test durchgeführt, um festzustellen, ob diese Funktion für ErrorEvent true

image

isError wird in der Methode captureException verwendet, um zu bestimmen, ob der Ausnahmeparameter ein Fehler oder einfach eine Nachricht ist. captureException sendet Ausnahmen mit captureMessage an das Dashboard, wenn die Ausnahme nicht tatsächlich ein Fehler ist. In diesem Fall berechnet Raven keine Stapelverfolgung oder "verarbeitet" die Ausnahme. Es schickt es einfach so wie es ist.

Gibt es einen Grund, warum wir isError nicht aktualisieren sollten, um true für ErrorEvent Objekte zurückzugeben?

Alle 31 Kommentare

Gibt es irgendwo in den Angular-Dokumenten eine Definition von ErrorEvent ? Anscheinend "erbt" dies Error auf die richtige Weise.

Das Problem könnte in der traceKitWindowOnError() -Methode von TraceKit liegen. Es scheint nicht zu berücksichtigen, dass das Argument message ein ErrorEvent (siehe MDN-Dokumente ).

@benvinegar Es gibt einige Dokumente hier auf ErrorEvent : https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent

Davon betroffen sind auch diese Benutzer:
https://forum.sentry.io/t/reporting-object-errorevent/1807

[email protected] (aber schon seit einiger Zeit bei älteren Versionen)
Winkel 4.x.
Verwenden der CLI

Gleiches gilt hier für Ionic 3 und [email protected]

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

^ Dies in Ihrem HTML wird in Safari per Wachposten als [object ErrorEvent] angemeldet. Die richtige Nachricht wäre TypeError: undefined is not an object (evaluating 'undefined.foo') .

Wir haben ein externes Skript, das Code über ein Skript-Tag einfügt, das versucht, einen Iframe zu erstellen, der jedoch durch Safari blockiert wird. Da der Fehler vom injizierten Skript-Tag herrührt, meldet der Wachposten nur [object ErrorEvent]

Ein weiterer Fehler von Sentry, der nur als [object Event] gemeldet wurde, stammt vom Flowplayer. Der Flowplayer tut es

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

Sie können es reproduzieren, indem Sie jQuery einbetten und einfach Folgendes tun:

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

Sentry sieht so etwas
image

Sicher, das ist nicht sehr serialisierbar, aber ein Fehler wie error on element from jQuery - context <div class="foo><div class="bar" ... wäre viel hilfreicher als [object Event]

Auch davon betroffen.

@daangeerdink @jdelaune @rosslavery @tgensol Könnte jemand einen möglichst kleinen Code bereitstellen, der mir helfen könnte, dies zu reproduzieren?

@sod Ich habe es gerade überprüft und Safari 10.1.2 liefert in dem oben erwähnten Szenario die richtige Meldung.

screen shot 2017-09-18 at 14 42 47

Ich persönlich kann keinen Repro bereitstellen, da die Fehler so undurchsichtig sind, dass ich nicht erkennen kann, welcher Teil meiner Codebasis den Fehler auslöst. Ich habe keine Stapelspuren, mit denen ich arbeiten kann, noch eine Fehlermeldung, um herauszufinden, ob es sich um meinen Code oder eine Bibliothek eines Drittanbieters usw. handelt.

Hoffentlich hat jemand anderes ein vereinfachtes Beispiel, das er bereitstellen kann. Tut mir leid, ich könnte Ihnen nicht weiterhelfen.

Wir haben auch dieses Problem. Ich kann einige Daten aus den letzten 10 Tagen teilen (22.000 Ereignisse dieses Typs, 13.000 Benutzer). Ich hoffe, es hilft Ihnen, es zu reproduzieren.
image

image

image

@kamilogorek Wir haben 2 Millionen Fehler dieses Typs. Ich dachte, es sei unser Problem, aber wir konnten es nicht richtig verfolgen.

Ich habe das Problem gefunden. ErrorEvent wird von der Funktion isError util, die hier zu finden ist, nicht als Fehler behandelt. Der Einfachheit halber füge ich auch die Funktionsdefinition ein:

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;
  }
}

Ich habe in meiner Konsole einen kurzen Test durchgeführt, um festzustellen, ob diese Funktion für ErrorEvent true

image

isError wird in der Methode captureException verwendet, um zu bestimmen, ob der Ausnahmeparameter ein Fehler oder einfach eine Nachricht ist. captureException sendet Ausnahmen mit captureMessage an das Dashboard, wenn die Ausnahme nicht tatsächlich ein Fehler ist. In diesem Fall berechnet Raven keine Stapelverfolgung oder "verarbeitet" die Ausnahme. Es schickt es einfach so wie es ist.

Gibt es einen Grund, warum wir isError nicht aktualisieren sollten, um true für ErrorEvent Objekte zurückzugeben?

Gibt es einen Grund, warum wir isError nicht aktualisieren sollten, um true für ErrorEvent-Objekte zurückzugeben?

Ja. Weil es eigentlich kein Nachkomme von Error (es ist ein Nachkomme von Event ). Es hat zum Beispiel keine stack -Eigenschaft (AFAICT, das in der Konsole herumspielt). Dies bedeutet, dass es möglicherweise nicht richtig verarbeitet wird.

Es wäre großartig, ein Beispiel dafür zu sehen, wie dieser Fehler live generiert wird, damit wir herausfinden können, wie er am besten verarbeitet werden kann.

Der Konstruktor für ErrorEvent nimmt ein Error , sodass Sie sie leicht wie folgt behandeln können:

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

Sie können die Konstruktionsdefinition hier sehen . Schauen Sie sich insbesondere den Hash ErrorEventInit . Es ist ein optionaler Parameter, daher denke ich, dass die oben veröffentlichte Lösung den Fall nicht behandelt, in dem ein ErrorEvent.error undefiniert ist.

Klar, ich glaube, das kann gelöst werden - ich meinte nur, dass es nicht so einfach ist, nur isError zu true .

Ich verstehe. Ich werde in ein paar Minuten eine PR machen.

Behoben in 3.19.x

Danke @shcallaway! 👍

Scheint, als würden wir dieses Problem immer noch auf 3.19.1 🤔 bekommen
image
image

@PhilippSpo Von welchem ​​Browser kommt dieses Ereignis? ErrorEvent wird in einigen alten mobilen Browsern und im Internet Explorer nicht unterstützt, daher mussten wir auf die reguläre Lösung zurückgreifen.

@kamilogorek Chrome 61.0.3163

Ich sehe es auch auf Chrome 61. 😕 Ich werde versuchen, es bald zu untersuchen.

Danke @shcallaway

Kommt auch unter Safari 11.0, Mac OS 10.13 vor

Es sieht so aus, als ob traceKitWindowOnError Eingabeparameter nicht korrekt verarbeitet, wenn der Parameter 'message' ein ErrorEvent-Objekt ist:
screen shot 2017-11-06 at 11 36 34
und 'ex' ist undefiniert. Anschließend wird notifyHandlers mit einem Objekt aufgerufen, bei dem das Feld 'message' ein ErrorEvent und keine Zeichenfolge ist:
screen shot 2017-11-06 at 11 41 14
Dies erzeugt, wenn es in

Vielen Dank für die Untersuchung @ michal-rumanek, ich werde versuchen, dieses Problem bald zu lösen (ich habe diese Woche keine Freizeit).

@kamilogorek , irgendwelche Fortschritte? ;-);

Hallo, ich bekomme viele dieser Fehler [object Object] .
screenshot 2017-12-01 09 41 20

Winkel 4
Chrome 62.0.3202
Raven-js 3.20.1

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen