我有一個看起來像這樣設置ErrorHandler:角的ErrorHandler包括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;
}
}
我得到這個來自:Global error handling angular 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
但在生產中使用的角度CLI時:ng build --prod --aot
的輸出是相同的錯誤是:
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
所以這不是對我來說有意義的堆棧跟蹤。如果我能在某些爲什麼會在我的開發環境中得到導致問題的組件?
你如何處理生產現場的錯誤?如果我想嘗試在我的代碼中的每個地方捕捉,我可以拋出特定類型的錯誤,但在沒有嘗試catch塊的地方?
Stacktrace應該始終顯示負責該錯誤的組件,而不是僅顯示捆綁中未定義的tostring!
確定。我的方法得到一個更好的輸入在我的生產構建出了什麼問題是讓我自己的錯誤處理程序角度,然後在我的組件關鍵的東西正在進行: 嘗試{ 某些關鍵.. } catch(ex ){ setError(ex,PersonDecideComponent.name,'selectionChange'); } 在我的錯誤處理程序即時消息組件名稱和發生異常的方法。該怎麼考慮這個解決方案? – NetProvoke
當你執行aot和prod時,你不能得到確切的錯誤,最好的辦法是使用catch併發送錯誤或方法供你參考服務器登錄到一個文件。然後你可以使用該引用進行調試 –