Wie funktioniert die globale Fehlerbehandlung bei Service-Mitarbeitern?

8

Ich habe Ссылка gefunden, das besagt:

  

Die onerror-Eigenschaft der ServiceWorkerContainer-Schnittstelle ist ein   Event-Handler ausgelöst, wenn ein Fehlerereignis in der zugeordneten auftritt   Servicemitarbeiter.

Ich kann dies jedoch nicht in Chrome (v51) durchführen. Im Rahmen der Hauptanwendung habe ich den folgenden Code von der Konsole aus ausgeführt:

%Vor%

Dann habe ich im Rahmen des aktiven Service-Mitarbeiters einen beliebigen Fehler ausgelöst:

%Vor%

Das Ergebnis war die übliche Fehlermeldung "Uncaught ReferenceError: f ist nicht definiert (...)", aber es wurde nicht über meinen globalen onerror-Handler protokolliert.

Die MDN-Seite besagt, dass diese API seit v40 in Chrome unterstützt wird, aber navigator.serviceWorker.onerror ist anfänglich undefiniert, was zu der Annahme führt, dass sie nicht implementiert ist. Kennt jemand das?

    
Rick Viscomi 09.06.2016, 21:16
quelle

1 Antwort

6

Vielleicht haben Sie versucht, den onerror -Handler auf den Container navigator.serviceWorker wie folgt zu setzen:

%Vor%

Der Error-Handler muss innerhalb eines Service-Worker-Skripts von festgelegt werden mit self.onerror ( self ist eine spezielle Variable / ein Attribut, die sich auf ServiceWorkerGlobalScope ). Der onerror Callback wird nur eine Fehlermeldung zur Verfügung gestellt.

%Vor%

Alternativ können Sie auch das error -Ereignis des Service-Mitarbeiters abhören, das ein ErrorEvent enthält, das den Fehlerort enthält:

%Vor%

Hier ist eine Demo . Stellen Sie sicher, dass Sie die Service-Mitarbeiter von DevTools & gt; Ressourcen & gt; Service Workers (auf der linken Seite) , da es mit diesen fehlgeschlagenen Service-Worker-Registrierungen gefüllt wird:

Ich habe folgende Browser-Unterstützung für onerror in einer Service-Worker-Instanz bestätigt:

  • Chrome 51 (stabil) und 53 (kanarienvogel)
  • Firefox 47
  • Opera 38 (stabil) und 39 (Entwickler)

AKTUALISIEREN :

  

Wenn also MDN die Schnittstelle ServiceWorkerContainer beschreibt, bezieht sich das auf self ( ServiceWorkerGlobalScope ) und nicht auf navigator.serviceWorker ?

Ich denke, das gilt nur für das onerror -Attribut (und vielleicht auch für die anderen Ereignisse dort), und ich nehme an, dass die Spezifikation nicht aktualisiert wurde, um die vereinbarte Implementierung widerzuspiegeln ...

Die Arbeitsgruppe "Service Workers" hatte beschlossen, onerror von der ServiceWorkerContainer in die Service-Worker-Instanz zu verschieben, wie in GitHub ( slightlyoff/ServiceWorker # 198 ):

  

kinu hat am 2. April 2014

kommentiert      

sgtm2. Für Fehlerberichte ( onerror stuff) könnten wir wahrscheinlich ähnliches tun? Z.B. Verschieben des .onerror -Handlers vom Container zum SW-Objekt, so dass das Dokument explizit wissen kann, aus welcher SW der Fehler stammt (obwohl es möglicherweise Handler an mehrere SWs anhängen muss).

Und dann gab es einen weiteren Kommentar in einem verwandten Problem ( slightlyoff/ServiceWorker # 104 ), die auf einen Mangel an Nützlichkeit für onerror auf dem Container hinweist:

  

jakearchibald hat am 3. April 2014

kommentiert      

Denken Sie über die Anwendungsfälle nach ( # 198 ) ...

     

navigator.serviceWorker.onerror oder navigator.serviceWorker.pending.onerror (was auch immer es ist) sind nicht nützlich, um Fehler zurück auf den Server zu protokollieren, da Fehler außerhalb der Lebensdauer einer Seite auftreten können. onerror innerhalb des Arbeiters selbst ist dafür am besten.

     

.pending.onerror ist nützlich, wenn Sie die Benutzeroberfläche als Reaktion auf ein Update aktualisieren. Also ist es vielleicht besser als statechange , obwohl Sie irgendwo eine Fehlermeldung haben müssten.

     

Dadurch bleiben Fehler, die vor der Erstellung der SW-Instanz auftreten. AppCache verfügt über ein Fehlerereignis, das netzwerkbezogene Aktualisierungsfehler abdeckt und auch Fehler analysiert. Wir würden jedoch alle Fehler, die außerhalb des Lebenszyklus einer Seite aufgetreten sind, wieder verlieren.

    
tony19 13.06.2016, 07:53
quelle