error-handler.service.ts 1.61 KiB
import { ErrorHandler, Injectable } from '@angular/core';
import { MessageService } from 'primeng/components/common/messageservice';
@Injectable()
export class ErrorHandlerService implements ErrorHandler {
  private readonly _console: Console = console;
  public constructor(private readonly messageService: MessageService) {}
  public handleError(error: any): void {
    const errorLogger = this.getErrorLogger(error);
    const original = this.getOriginalError(error);
    const context = this.getDebugContext(error);
    const message = (original || error).message || `${error}`;
    errorLogger(this._console, 'ERROR', message);
    if (original) {
      errorLogger(this._console, 'ORIGINAL ERROR', original);
    if (context) {
      errorLogger(this._console, 'CONTEXT', context);
    this.messageService.add({
      severity: 'error',
      summary: (original || error).constructor.name,
      detail: message,
      life: 15,
      closable: true,
      data: error,
    });
  private getDebugContext(error?: Error): any {
    return error
      ? (error as any).ngDebugContext ||
          this.getDebugContext(this.getOriginalError(error))
      : null;
  private getOriginalError(error: Error): Error {
    let original = error;
    while (original) {
      original = (original as any).ngOriginalError;
    return original;
  private getErrorLogger(
    error: Error
  ): (console: Console, ...values: any[]) => void {
    return (error as any).ngErrorLogger || this.defaultErrorLogger;
  private defaultErrorLogger(console: Console, ...values: any[]) {
    (<any>console.error)(...values);