Recall that then (and catch and such) create a new promise that the code in your callback can affect the outcome of. In the Promises/A+ style of promises (JavaScript's native promises adhere to those semantics, and jQuery's been trying to bring Deferreds in line — and the v3.1.1 you're using is in line now I believe), when you throw in a promise then or catch callback, that exception is converted into a rejection of the promise created by the then or catch method.

So your throw new Error(...) is becoming a rejection of the promise returned by your call to then.

Browsers are updating their handling of unhandled rejections so that those appear in the console (support for this varies at present); it may be worth switching over to native promises.

Just for illustration, here's an example of a native promise throwing within a then callback: