2017-06-02 169 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 –