2017-06-02 186 views
5

我需要在angular 4應用程序中實現全局錯誤處理。 它是ErrorHandler機制,適用於某些情況,但不適用於所有情況。 例如:當我們遇到一些嚴重錯誤,如丟失模板或其他東西時,ErrorHandler忽略它。當我使用錯誤的URL模板,我得到Zone.js錯誤:Angular 2/4全局錯誤處理

zone.js?fad3:567 Unhandled Promise rejection: Template parse errors: 
'my-app' is not a known element: 

Zone.js不會引發異常,它只是控制檯錯誤,所以window.onerror沒有工作過。

錯誤處理程序:

@Injectable() 
export class CommonErrorHandler implements ErrorHandler { 
    constructor(private injector: Injector) { 

    } 


    public handleError(error: any): void { 
     console.log("error", error); 
    } 
} 

登記在app.module:

providers: [ 
     AuthGuard, 
     { provide: ErrorHandler, useClass: CommonErrorHandler } 
} 

UPD plnkr例如加入:

example

+0

你能提供你當前的'ErrorHandler'的代碼嗎? – Arg0n

+0

@ Arg0n,添加代碼。 –

回答

6

角用途zone.js解析未處理的異常,並拒絕: https://github.com/angular/zone.js/blob/master/dist/zone.js#L633

您需要使用NgZone服務來解析這些錯誤: https://angular.io/docs/ts/latest/api/core/index/NgZone-class.html

NgZone API被標記爲「實驗性」的,但我不知道它如何與現實。一堆廣泛使用的API仍然是「實驗性」的。

例子:

@Component(...) 
class AppComponent { 
    constructor(protected zone: NgZone) { 
    this.zone.onError.subscribe((e) => { 
     console.log(e); 
    }); 
    setTimeout(() => { 
     throw new Error(); 
    }, 1000); 
    setTimeout(() => { 
     Promise.reject('unhandled'); 
    }, 1000); 
    } 
} 

這樣,您就可以看到這兩個錯誤。

@EDIT:我發現這個https://angular-2-training-book.rangle.io/handout/zones/非常有用。

+0

謝謝。但它不起作用。看起來像AppComponent初始化之前的角斷點。 –

+0

創建這個https://plnkr.co/edit/FQxR45n7oBYuexsMNWPl?p=info –