See to me Throw is an improvement because it stops it dead in its tracks and can be used to issue a system level intercept. If you're working with events -- especially hardware events -- it's nice to finally not have to resort to assembly just because traditional C went out of its way to restrict your access. Working in RTOS like QNX it's kind of a must have.... and it really makes life easier in pervasively multithreaded environments since you can hook and halt your other threads.
That said throw in JS should stop ALL scripts, not just the one it was called in.
As to writing a DOM, so... you've never worked in a language like C or Ada that don't have readily available or reliable simple parsers so you can data scrape? You've never written DOM-like binary trees for 3d modeling and 3d games? In this day and age of multithreading it's often better to unload stuff like vector sorting across multiple cores/threads instead of taking up the GPU's time if your projections are non-standard. (such as "fisheye effects".
But what do I know? I'm the nutter who instead of divide by Z does his perspective calculations via ARCTAN2. Off the shelf video API's have zero provision for that. Pain in the ass when you're stuck doing it on the CPU or trying to get shader languages to do it... and important to be able to do when you're working with self-guided vehicles.