I adopt the "kill everything and start fresh" approach. For big/fatal errors.
Some of my tests have dependencies on previous tests. In some cases, it's almost unavoidable. It kind of depends what you're doing. In most of these cases they could be made entirely standalone, but the amount of setup work required for each (which the previous tests are at least partly responsible for) would become huge and the runtime would stretch out something silly.
So we accept that sometimes an error sometimes can, and should, cause an abandonment. But without losing the entire run - if possible.
So I deal with this in two ways.
My framework splits tests into "packs". That's a key part of it. Packs should not be huge. And should deal with small, functionally linked, tests.
A "pack" will NEVER have a dependency on a test in another pack. Any dependencies MUST be within the pack. And even the, should be kept to a minimum.
All error handling is done by custom routines. For a simple test failing, I allow tests within a "pack" to have a dependency on previous step(s) within the back. That is to say I can put logic in which allows a test to say "if this passes, do this" / "if this fails do this". This allows me to work round small, known, bugs and the tests will auto-correct themselves when it's fixed but still report the failure while it's not.
But if a larger error occurs, the application crashes being the obvious one, it will kill the application (or website) and all services related to it. Log as much error info as possible, and simply move onto the next "pack". Every pack is designed to start the application/site from a clean baseline and most will have some sort of restore (be it a DB or whatever) or tear-down routine which should always be the first step in any pack. Tests can also be coded to pass back a flag to the main handler which indicate that something terrible has happened and the "pack" should be abandoned.
Seems to work for me. I can work round small errors and defects, and get out of jail with a clean start for bigger ones without losing everything.
Of course, if the application has crashed/broken so badly that it no longer works, even after tear downs and restores, then every subsequent "pack" will simply fail out as well. But there isn't much anyone can do about that (bar re-running installers etc - way too complex) but at least we get a log telling us this. :)