2017-09-16 44 views
1

我有一個看起來像這樣設置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!

回答

0

你得到這個的原因是當運行命令ng build --prod --aot

構建利用綁定和有限的樹狀結構,而--prod構建也通過UglifyJS運行有限的無代碼刪除。

簡而言之 - 所有錯誤日誌都被縮小,以便減小捆綁包的大小。i:e是我們在生產構建中遇到錯誤消息的原因之一。

爲了這不會發生,你可以使用這個命令,但僅在測試ng serve --aotng serve --prod來檢查任何錯誤,

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

+0

確定。我的方法得到一個更好的輸入在我的生產構建出了什麼問題是讓我自己的錯誤處理程序角度,然後在我的組件關鍵的東西正在進行: 嘗試{ 某些關鍵.. } catch(ex ){ setError(ex,PersonDecideComponent.name,'selectionChange'); } 在我的錯誤處理程序即時消息組件名稱和發生異常的方法。該怎麼考慮這個解決方案? – NetProvoke

+0

當你執行aot和prod時,你不能得到確切的錯誤,最好的辦法是使用catch併發送錯誤或方法供你參考服務器登錄到一個文件。然後你可以使用該引用進行調試 –

相關問題