2017-09-16 4 views
1

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!

Répondre

0

La raison pour laquelle vous obtenez ceci est lors de l'exécution de la commande ng build --prod --aot.

Les builds utilisent le groupage et l'arborescence limitée, tandis que les builds -prod exécutent également l'élimination limitée du code mort via UglifyJS. En bref - tous les journaux d'erreurs sont réduits de sorte que la taille de l'ensemble est réduite. C'est l'une des raisons pour lesquelles nous obtenons le message d'erreur corrigé dans Production build.

Pour que cela se produise pas, vous pouvez utiliser cette commande mais seulement lors de tests ng serve --aot ou ng serve --prod pour vérifier toutes les erreurs que

The AOT compiler detects and reports template binding errors during the build step before users can see them.

+0

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

+0

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 –