@sentry/browser
@sentry/node
raven-js
raven-node
_(corbeau pour nœud)_@sentry/browser": "4.4.2"
Salut tout le monde,
Comme je l'ai décrit ci-dessus, j'utilise Angular6 + Ngrx6.
Ce que je veux faire, c'est envoyer une erreur à Sentry lorsque webApp échoue à l'appel api.
Disons que j'appelle une API appelée /abc/3
qui n'existe pas.
Ensuite, le client obtient une erreur 404 Not Found
.
Et c'est celui que je veux envoyer à Sentry via @sentry/browser
.
J'ai créé un service simple.
@Injectable({
providedIn: 'root'
})
export class SentryService {
constructor() { }
captureException(error: any) {
Sentry.captureException(error.originalError || error);
throw error;
}
}
et ont créé SentryErrorHandler
qui étend les ErrorHandler
d'Angular
@Injectable()
export class SentryErrorHandler implements ErrorHandler {
constructor(private sentry: SentryService) {}
handleError(error: any): void {
this.sentry.captureException(error);
throw error;
}
}
Ce code détecte bien les erreurs js normales telles que
abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.
Cependant, j'ai compris que le code ci-dessus ne détecte pas d'erreur réseau. (Comme je l'ai dit /abc/3
)
J'ai donc créé ErrorInterceptor
qui étend HttpInterceptor
d'Angular.
@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);
}
})
);
}
}
Ensuite, je pourrais attraper l'erreur de réseau.
Mais le problème est que je n'en vois aucun dans mon tableau de bord Sentry.
J'ai vérifié mon onglet réseau Chrome. Et j'ai pu trouver un message :
"Exception sans erreur capturée avec des clés : erreur, en-têtes, message, nom, ok…"
Donc je suppose que @sentry/browser ne pense pas que ce soit une erreur.
J'ai aussi découvert que parler de Non-Error exception captured with keys: error, headers, message, name, ok…
Voici donc mes questions.
Merci!
@Taewa L'objet d'erreur lancé par Angular n'est pas au même format qu'un SentryEvent
.
Une façon serait d'utiliser simplement le captureMessage(message: string)
avec certaines des informations d'erreur. C'est aussi la manière la plus simple que j'ai choisie : https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts
Une autre façon serait de créer vous-même un objet d'événement Sentry et d'utiliser la méthode captureEvent(event: SentryEvent)
pour l'envoyer à Sentry.
J'espère que cela t'aides. 🙂
Merci @pascaliske
En fait, j'ai résolu en utilisant captureMessage(message: string)
que vous avez mentionné.
Ce serait utile pour les futurs visiteurs :)
Je ferme ce sujet car il semble être résolu.
Commentaire le plus utile
@Taewa L'objet d'erreur lancé par Angular n'est pas au même format qu'un
SentryEvent
.Une façon serait d'utiliser simplement le
captureMessage(message: string)
avec certaines des informations d'erreur. C'est aussi la manière la plus simple que j'ai choisie : https://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.tsUne autre façon serait de créer vous-même un objet d'événement Sentry et d'utiliser la méthode
captureEvent(event: SentryEvent)
pour l'envoyer à Sentry.J'espère que cela t'aides. 🙂