Yes, that's a better way of going about it. I'll confess that when I'm coding things quickly, I often do the simplest thing and just return the undef rather than raise an exception. In my tests, I get a chance to evaluate this how this actually works and when I have problems, I go back in and croak, carp, or silently ignore the issue, depending upon what it is and how it affects the actual problem.
That being said, I really like tye's error object idea. If I can create a class that has an Exception object, no methods, and an AUTOLOAD, I can get robust error handling with plenty of flexibility. And again, if someone doesn't like chained calls, they still don't have to use them.