我需要在angular 4 app中实现全局错误处理。
它是ErrorHandler
机制,适用于某些情况,但并非适用于所有情况。
例如:当我们遇到一些严重错误,比如缺少模板或其他内容时,ErrorHandler
会忽略它。当我使用错误的网址模板时,我得到Zone.js错误:
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示例补充说:
答案 0 :(得分:10)
Angular使用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仍然是“实验性的”。
示例:
import { NgZone } from '@angular/core';
@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/非常有用。
答案 1 :(得分:0)
被接受的解决方案对我不起作用,因为我的错误是在初始化时发生的(例如,一个未在模块中声明的组件),并且由于我有加载动画,所以我想停止它。
相反,我尝试将try bootstrapModule代码封装在try / catch中
try {
platformBrowserDynamic()
.bootstrapModule(AppModule)
.catch(err => {
// Handle runtime error in angular
});
} catch (err) {
// handle angular loading error here. I do that by hidding the animation div and showing the error div
var node = document.getElementById('app-loading-error');
if (node) {
node.style.display = 'inherit';
}
var node = document.getElementById('app-loading-pending');
if (node) {
node.style.display = 'none';
}
throw err; // pass it back to the console
}