Unlike guards and interceptors (global → controller → method), exception filter resolution works in reverse: method → controller → global. The most specific filter wins. The @Catch() type must match the thrown exception for a filter to apply — a filter for NotFoundException will not handle BadRequestException.
Method-level filters are checked first, then controller-level, then global.
The first filter whose @Catch() type matches the thrown exception handles it.
@Catch(NotFoundException) will NOT handle BadRequestException — the types must match.
@Catch() with no argument matches everything — use only at the global level.
Multiple @Catch() types are supported: @Catch(NotFoundException, BadRequestException).