in reply to Using die() in methods

Check out Exception::Class. Also, one may use the PROPAGATE method to accumulate die warnings as they may move up the call stack.

My only advice is to be sensible and don't forget that value of clarity and consistency (if you have controle of either); I rather liberally use die() or throw (from Exception::Class) - especially for resource bound things like databases

Testing exceptions is easy with Test::Exception.

I've always found this Advent entry from 2011 enlightening, http://perladvent.org/2011/2011-12-17.html. I don't use try/catch, but there is good background info in there.

As far as what value to return? Sometimes as you point out you want to return undef or 0. In cases where undef means error but 0 is a legit value, use "defined" to test the return value other than just something like if ($ret) {..}