From the C ++ 2003 Standard ยง15.1 [except.throw] / 8:
If no exception is currently thrown, the throw statement is executed without any terminate() operands.
So, in your example, since no exception is currently being handled, nothing is thrown, and terminate() is called instead. Since terminate() not returned, your catch will never be entered.
source share