Ouch provides a class for exception handling that doesn't require a lot of boilerplate, nor any up front definition. If Exception::Class is working for you, great! But if you want something that is faster, easier to use, requires less typing, and has no prereqs, but still gives you much of that same functionality, then Ouch is for you.

It really comes down to Carp isn't enough for me, and Exception::Class does what I want but makes me type way too much. Also, I tend to work on a lot of protocol-based systems that use error codes (HTTP, FTP, SMTP, JSON-RPC) rather than error classes, so that feels more natural to me. Consider the difference between these:

Optional. Anything you want to attach to the exception to help a developer catching it decide what to do. For example, if you're doing form processing, you might want this to be the name of the field that caused the exception.

WARNING: Do not include objects or code refs in your data. This should only be stuff that is easily serializable like scalars, array refs, and hash refs.

Optional. If you like you can pass the exception into kiss. If not, it will just use whatever is in $@. You might want to do this if you've saved the exception before running another eval, for example.

Using Try::Tiny has some impedence mismatch in that the exception is propagated through $_ instead of $@ (the default used by Ouch). This forces to always include $_ when calling functions in Ouch, which is suboptimal. It's possible to do this: