in reply to exit calling subroutine

If something goes wrong, throw and exception with die, and you can catch it at an arbitrary level with eval (in the BLOCK form).

That's what exceptions where made for, after all ;-)