@sentry/browser
@sentry/node
raven-js
raven-node
_(Rabe für Knoten)_@sentry/browser": "4.4.2"
Hallo zusammen,
Wie ich oben beschrieben habe, verwende ich Angular6 + Ngrx6.
Was ich tun möchte, ist, dass ein Fehler an Sentry gesendet wird, wenn webApp den API-Aufruf fehlschlägt.
Nehmen wir an, ich rufe eine API namens /abc/3
, die nicht existiert.
Dann erhält der Client einen 404 Not Found
Fehler.
Und das ist derjenige, den ich über @sentry/browser
an Sentry senden möchte.
Ich habe einen einfachen Dienst erstellt.
@Injectable({
providedIn: 'root'
})
export class SentryService {
constructor() { }
captureException(error: any) {
Sentry.captureException(error.originalError || error);
throw error;
}
}
und haben SentryErrorHandler
erstellt, das ErrorHandler
Angular erweitert
@Injectable()
export class SentryErrorHandler implements ErrorHandler {
constructor(private sentry: SentryService) {}
handleError(error: any): void {
this.sentry.captureException(error);
throw error;
}
}
Dieser Code erkennt gut normale js-Fehler wie z
abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.
Ich habe jedoch herausgefunden, dass der obige Code keinen Netzwerkfehler erkennt. (Wie ich schon sagte /abc/3
)
Also habe ich ErrorInterceptor
erstellt, das HttpInterceptor
Angular erweitert.
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(
private _injector: Injector,
private sentry: SentryService
) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req)
.pipe(
tap(event => {}, error => {
if (error) {
this.sentry.captureException(error);
}
})
);
}
}
Dann könnte ich den Netzwerkfehler abfangen.
Aber das Problem ist, dass ich in meinem Sentry-Dashboard keine sehen kann.
Ich habe meinen Chrome-Netzwerk-Tab überprüft. Und ich konnte eine Nachricht finden:
"Non-Error-Ausnahme mit Schlüsseln erfasst: Fehler, Header, Nachricht, Name, ok ..."
Also denke ich, dass @sentry/browser dies nicht für einen Fehler hält.
Ich habe auch herausgefunden , dass über Non-Error exception captured with keys: error, headers, message, name, ok…
gesprochen wird
Hier also meine Fragen.
Danke!
@Taewa Das von Angular ausgelöste Fehlerobjekt hat nicht das gleiche Format wie ein SentryEvent
.
Eine Möglichkeit wäre, einfach captureMessage(message: string)
mit einigen der Fehlerinformationen zu verwenden. Das ist auch der einfachere Weg, den ich gewählt habe: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts
Eine andere Möglichkeit wäre, selbst ein Sentry-Ereignisobjekt zu erstellen und die captureEvent(event: SentryEvent)
-Methode zu verwenden, um es an Sentry zu senden.
Hoffe das hilft. 🙂
Danke @pascaliske
Ich habe es tatsächlich gelöst, indem ich captureMessage(message: string)
verwendet habe, das Sie erwähnt haben.
Es wäre hilfreich für die zukünftigen Besucher :)
Dieses Problem wird geschlossen, da es anscheinend behoben ist.
Hilfreichster Kommentar
@Taewa Das von Angular ausgelöste Fehlerobjekt hat nicht das gleiche Format wie ein
SentryEvent
.Eine Möglichkeit wäre, einfach
captureMessage(message: string)
mit einigen der Fehlerinformationen zu verwenden. Das ist auch der einfachere Weg, den ich gewählt habe: https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.tsEine andere Möglichkeit wäre, selbst ein Sentry-Ereignisobjekt zu erstellen und die
captureEvent(event: SentryEvent)
-Methode zu verwenden, um es an Sentry zu senden.Hoffe das hilft. 🙂