I use
Exception::Class to build exception hierarchies and
Exception::Class::TCF for try/catch functionality. If a standard
die is called inside a try block,
Exception::Class::TCF turns it into an exception object (of class 'Default') through some clever jiggery-pokery. Might be what you're looking for.