I think ad hoc just means no underlying system which is the definition of exceptions based design. You create an element and you figure out if it is workable by play testing. Many things throughout the life of D&D were just arbitrary decisions. Is fly better or equal to fireball? Well it depends. The only version of D&D that tried to be at all systematic was 3e and the burden of monster design nearly drove the WOTC staff to despair.
Er....that's not what exception-based design is though.
Exception-based design says that X thing
is true,
unless specifically instructed otherwise. It is not ad-hoc at all.
The difference between the actually exception-based design of 4e and the...I'm not even sure what to call it, design of 3e is that 4e is bottom-up, while 3e is top-down.
I think this is best exemplified by looking at the idea of "good/noble undead." In 4e, such a thing is perfectly simple. Use the normal "undead" creature type, then add a feature on your special "good/noble undead" which modifies the effects. The undead creature type remains unchanged, but a new modifier is layered on top, without changing anything
else that depends on that creature type. By comparison, in 3e, a thing like this isn't possible. You have to create a
new creature type, "deathless," which starts from the ground up as a good/noble undead powered by positive energy etc., etc.
This is just one emblematic example. There are plenty. For example, 4e makes prolific use of "stat-swap" features, so (for example) Dragon Soul Sorcerers can add their Strength modifier to AC instead of their Dexterity modifier. That's an exception-based design solution to the problem that a character pumping Charisma and Strength will end up much too fragile. Doing an equivalent thing in 3e is a much more painful process, almost always involving some sort of feat, spell, or other bespoke structure that from the jump
starts with the problem "fixed." This is how you got, for example, a proliferation of optional base classes that were just "X, but with a different core stat." (I'm reminded of the "Battledancer," for example, which was...very nearly just "monk, but based off Cha rather than Dex.")
Exception-based design means you build generically-useful
baselines, and rely upon them whenever you need them, but you don't
limit yourself to them: you build on top of them, as one does with foundations. Whatever the top-down approach from 3e is, it results in having to carefully, carefully hang each new element off of something that can handle it....and all too often there either isn't such a thing, or any choice you could use will have some negative knock-on consequence (often very difficult to predict in advance.)