@@ -3,6 +3,8 @@ import { Constructable, Container } from '@artus/injection';
33import { EXCEPTION_FILTER_DEFAULT_SYMBOL , EXCEPTION_FILTER_MAP_INJECT_ID } from './constant' ;
44import { ArtusStdError } from './impl' ;
55import { ExceptionFilterMapType , ExceptionFilterType } from './types' ;
6+ import { isClass } from '../utils/is' ;
7+
68
79export const matchExceptionFilterClazz = ( err : Error , container : Container ) : Constructable < ExceptionFilterType > | null => {
810 const filterMap : ExceptionFilterMapType = container . get ( EXCEPTION_FILTER_MAP_INJECT_ID , {
@@ -11,18 +13,27 @@ export const matchExceptionFilterClazz = (err: Error, container: Container): Co
1113 if ( ! filterMap ) {
1214 return null ;
1315 }
14- let targetFilterClazz : Constructable < ExceptionFilterType > | null = null ;
16+
17+ // handle ArtusStdError with code simply
1518 if ( err instanceof ArtusStdError && filterMap . has ( err . code ) ) {
16- // handle ArtusStdError with code simply
17- targetFilterClazz = filterMap . get ( err . code ) ;
18- } else if ( filterMap . has ( err [ 'constructor' ] as Constructable < Error > ) ) {
19- // handle CustomErrorClazz
20- targetFilterClazz = filterMap . get ( err [ 'constructor' ] as Constructable < Error > ) ;
21- } else if ( filterMap . has ( EXCEPTION_FILTER_DEFAULT_SYMBOL ) ) {
22- // handle default ExceptionFilter
23- targetFilterClazz = filterMap . get ( EXCEPTION_FILTER_DEFAULT_SYMBOL ) ;
19+ return filterMap . get ( err . code ) ;
20+ }
21+
22+ // handle CustomErrorClazz, loop inherit class
23+ let errConstructor : Function = err [ 'constructor' ] ;
24+ while ( isClass ( errConstructor ) ) { // until parent/self is not class
25+ if ( filterMap . has ( errConstructor as Constructable < Error > ) ) {
26+ return filterMap . get ( errConstructor as Constructable < Error > ) ;
27+ }
28+ errConstructor = Object . getPrototypeOf ( errConstructor ) ; // get parent clazz by prototype
2429 }
25- return targetFilterClazz ;
30+
31+ // handle default ExceptionFilter
32+ if ( filterMap . has ( EXCEPTION_FILTER_DEFAULT_SYMBOL ) ) {
33+ return filterMap . get ( EXCEPTION_FILTER_DEFAULT_SYMBOL ) ;
34+ }
35+
36+ return null ;
2637} ;
2738
2839export const matchExceptionFilter = ( err : Error , container : Container ) : ExceptionFilterType | null => {
0 commit comments