J'ai un ErrorHandler qui ressemble à ceci:ErrorHandler angulaire comprennent le composant sur faisceau de AOT
@Injectable() export class GlobalErrorHandler implements ErrorHandler {
constructor(private injector: Injector) { }
handleError(error) {
const errorService = this.injector.get(ErrorService);
const location = this.injector.get(LocationStrategy);
const url = location instanceof PathLocationStrategy
? location.path() : '';
StackTrace.fromError(error).then(stackframes => {
const stackString = stackframes
.splice(0, 20)
.map((sf) => {
return sf.toString();
}).join('\n');
const errorObject: IError = {
errorMessage: error.messagen,
stackTrace: stackString,
path: url
};
// Display something to user
errorService.setError(errorObject);
// TODO: send to server
});
// IMPORTANT: Rethrow the error otherwise it gets swallowed
throw error;
}
}
J'ai eu ce à partir de: Global error handling angular 2
Ma question est que quand je lance ce dans le développement, il fonctionne comme prévu avec un sens stacktrace où le composant est inclus:
par exemple:
ngOnInit()@webpack:///src/app/person/userdetail-page/userdetail-page.component.ts:29:19 __tryOrSetError()@webpack:///~/rxjs/Subscriber.js:247:0 this.__tryOrSetError()@webpack:///~/rxjs/Subscriber.js:187:0 _next()@webpack:///~/rxjs/Subscriber.js:125:0 next()@webpack:///~/rxjs/Subscriber.js:89:0 notifyNext()@webpack:///~/rxjs/operator/switchMap.js:124:0
Mais quand la production en utilisant cli angulaire: ng build --prod --aot
La sortie est la même erreur est:
property 'toString' of undefined TypeError: Cannot read property 'toString' of undefined at e._next (http://xxx.azurewebsites.net/main.b21b245638698421733f.bundle.js:1:5701) at e.__tryOrSetError (http://xxx.azurewebsites.net/vendor.1cd9b81fc017fd7eac16.bundle.js:835:16880) at e.next
Donc, ce n'est pas un stacktrace significatif pour moi. Si je pouvais obtenir le composant causant le problème dans certains pourquoi comme dans mon environnement de développement ??!
Comment gérez-vous les erreurs sur vos sites de production? Si j'aurais essayé d'attraper dans chaque endroit dans mon code je pourrais jeter en erreur d'un type spécifique mais dans des endroits où il n'y a aucun bloc d'essai de prise?
Stacktrace devrait toujours montrer le composant responsable de l'erreur et ne pas montrer seulement la chaîne de l'ensemble indéfini!
Ok. Mon approche pour obtenir une meilleure entrée sur ce qui ne va pas dans ma production était de faire mon propre errorhandler en angulaire puis dans mon composant où les choses critiques se passent: try { quelque chose de critique .. } catch (ex) { setError (ex, PersonDecideComponent.name, 'selectionChange'); } Dans mon errorhandler, je me déconnecte du nom du composant et de quelle méthode l'exception s'est produite. Que penser de cette solution? – NetProvoke
vous ne pouvez pas obtenir l'erreur exacte lorsque vous faites un aot et prod construire la meilleure chose est d'utiliser une capture et envoyer l'erreur ou la méthode pour votre référence au serveur pour se connecter à un fichier. Et puis vous pouvez déboguer en utilisant cette refernce –