O_o
There really is no chance of an infinite loop beyond using insane methods involving 'goto'. (Which I'm sure would only work with SJLJ style exceptions.)
Declaring a function as 'throw()' is more than just informative; a compiler will insert a 'terminate' try/catch block. (Which is why throw specifications should generally be avoided.) An exception can not "escape" from 'what()'. (Even if 'what()' wasn't declared as 'throw()' there are generally a finite number blocks as CornedBee said.)
Soma