您可以像这样在全局级别定义自定义错误处理程序:
custom-error-handler.service.ts
import { ErrorHandler, Injectable } from '@angular/core';
@Injectable()
export class CustomErrorHandler implements ErrorHandler {
constructor() { }
handleError(error) {
// your custom error handling logic
console.log('GLOBAL ERROR CAUGHT: ', error.toString())
}
}
app.module.ts
import { NgModule, ErrorHandler } from '@angular/core';
import { CustomErrorHandler } from './custom-error-handler.service';
@NgModule({
// ...
providers: [
{
provide: ErrorHandler,
useClass: CustomErrorHandler
}
],
// ...
})
export class AppModule { }
但是你不能用它来发现一个变量上的错字。这是有道理的。如果你采取以下组件:
TS
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
name = 'Angular 6';
triggerError() {
throw new Error('Some error');
}
}
HTML
<!-- variable is defined as `name` but typo -->
<p>
Name: {{ nam || 'Default name' }}
</p>
<button (click)="triggerError()">Trigger error caught by global/custom error handler</button>
这里我们进入渲染视图“默认名称”,因为 nam 只是未定义。这不是一个实际的错误。尝试在浏览器控制台或 nodejs 上下文中编写undefined,很好。这不是错误。
也就是说,如果您尝试访问未定义对象的属性,则会出现错误。因此,如果您将 HTML 更新为:
<p>
Name: {{ nam.someUndefinedProp || 'Default name' }}
</p>
您会注意到CustomErrorHandler 捕获了该错误。
但总的来说,我不建议您这样做。这必须得到确认,但也许 AOT 可以捕捉到这一点,如果没有,你应该编写一些集成或 E2E 测试来捕捉它。
这是一个关于 stackblitz 的工作示例:
https://stackblitz.com/edit/angular-sipcki?file=src%2Fapp%2Fapp.component.html