@trevnorris, in just a few words, the async_wrap module should be capable of acting like a try{} catch() {} over asynchronous fragments, including nextTick (I'm aware of #6082) and timers. Why? To pave the way to replacing the current error domains.
In my view, the execution should simply not get to process._fatalException when the error is handled. I noticed that the API presented in this talk doesn't even pass the thrown value.