My gut-level feeling on this is that $! is going to end up being an "env" variable like $_. (If you don't know what "env" is then you've not read the conjectural parts of S2 lately.) Then the problem reduces to what you do with an unhandled $! at the end of a lexical scope, which is probably just to fail, insofar as this style of processing is treating the rest of the block as an implicit catch block. We'd also have to determine what "handled" means. Probably just evaluating $! for boolean is sufficient to mark it as handled.
With the env solution, if an inner sub wants to refer to its caller's $!, it'd use $+! or ENV::<$!> instead of $!. And $! passed to a sub as an argument would simply be a different variable, just as everyone gets their own $_ right now. Larry