次のようなエラーハンドラがあります。
@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;
}
}
私はこれを取得しました:グローバルエラー処理角度2
私の質問は、開発でこれを実行すると、コンポーネントが含まれている意味のあるスタックトレースで期待どおりに機能するということです:
例えば:
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
ただし、Angular cliを使用して本番環境にある場合:ng build --prod --aot
同じエラーの出力は次のとおりです。
プロパティ 'toString' の 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 ) e.next で
したがって、これは私にとって意味のあるスタックトレースではありません。私の開発環境のように、問題の原因となっているコンポーネントを取得できたのはなぜですか??!
本番サイトのエラーをどのように処理していますか? コードのすべての場所で try catch を使用すると、特定のタイプのエラーをスローできますが、try catch ブロックがない場所で発生しますか??
スタックトレースは、バンドル内の未定義の tostring を表示するだけでなく、エラーの原因となっているコンポーネントを常に表示する必要があります!