Вы можете определить собственный обработчик ошибок на глобальном уровне, например:
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
просто не определено.Это не настоящая ошибка.Попробуйте написать undefined
в консоли браузера или в контексте nodejs, хорошо.Это не ошибка.
То есть, если вы попытаетесь получить доступ к свойству, которое не определено для объекта, вы получите ошибку.Поэтому, если вы обновите HTML-код до:
<p>
Name: {{ nam.someUndefinedProp || 'Default name' }}
</p>
Вы заметите, что CustomErrorHandler
перехватил эту ошибку.
Но в целом я бы не советовал вам это делать.Это должно быть подтверждено, но, возможно, AOT сможет это отловить, а если нет, вам просто нужно написать какие-нибудь интеграционные или E2E-тесты, которые бы это поймали.
Вот рабочий пример для stackblitz:
https://stackblitz.com/edit/angular-sipcki?file=src%2Fapp%2Fapp.component.html