# All files / core/exceptions exceptions-handler.ts

94.74% Statements 18/19
90% Branches 9/10
100% Functions 6/6
94.44% Lines 17/18

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40

    1x
    1x
    1x

    1x
    25x

    3x

    3x

    3x
    1x

    2x

    9x

    3x

    3x

    3x

    3x

    3x
    3x

     import { HttpException } from '@nestjs/common';
    import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface';
    import { ArgumentsHost } from '@nestjs/common/interfaces/features/arguments-host.interface';
    import { isEmpty } from '@nestjs/common/utils/shared.utils';
    import { InvalidExceptionFilterException } from '../errors/exceptions/invalid-exception-filter.exception';
    import { BaseExceptionFilter } from './base-exception-filter';

    export class ExceptionsHandler extends BaseExceptionFilter {
      private filters: ExceptionFilterMetadata[] = [];

      public next(exception: Error | HttpException | any, ctx: ArgumentsHost) {
        Iif (this.invokeCustomFilters(exception, ctx)) {
          return;
        }
        super.catch(exception, ctx);
      }

      public setCustomFilters(filters: ExceptionFilterMetadata[]) {
        if (!Array.isArray(filters)) {
          throw new InvalidExceptionFilterException();
        }
        this.filters = filters;
      }

      public invokeCustomFilters(exception, response): boolean {
        if (isEmpty(this.filters)) return false;

        const filter = this.filters.find(({ exceptionMetatypes }) => {
          const hasMetatype =
            !exceptionMetatypes.length ||
            exceptionMetatypes.some(
              ExceptionMetatype => exception instanceof ExceptionMetatype,
            );
          return hasMetatype;
        });
        filter && filter.func(exception, response);
        return !!filter;
      }
    }