CPAN Review: Try::Tiny

As part of a series of blog posts, I'm going to attempt to find a newly released CPAN module every day and review it.


Today a new version of Try::Tiny was released that fixed some documentation issues. Most people will remember the old school way or maybe
not so old school way of trying to catch exceptions in Perl:

eval {
        ..some code..
        exception gets thrown

    if ( $@ ) {
        do some clean up and pray $@ hasn't been wiped.

The problem with the above is that the special $@ is a global variable and tends to have problems in older versions of Perl, especially
prior to 5.16. One such problem is that $@ can be wiped if another eval is called, this can often happen if an object has a destructor
that calls eval. So to mitigate this issue developers would sometimes do things such as the following:

eval { ..some code.. {die} 1; } || do { handle exception }.
Other solutions, probably a better one, would look like this:
my $error = do {
        local $@;
        eval { .. };

    die $error;

So Try::Tiny through the power of prototypes creates a new syntax which does the localizing of $@ for a developer with a cleaner syntax:

try {
die "for some reason";
} catch {
say "Oh no, I got this error! $_";

This is a much more elegant interface and they even throw in a finally keyword too. Overall this seems nicer but introduces it's own caveats
which a developer using this module need to care when using. The primary one is that Try::Tiny is not adding any new keywords but is using prototypes that create the
illusion of new syntax. So if someone were to forget to put a semi-colon after the try parenthesis they may be unpleasantly surprised that code
inside a catch might be executed prior to a try being executed, for example:

try { } catch { run_this() }

run_this will be executed before the try block.

Overall I still like Try::Tiny and believe it's a step in the right direction - even if it feels a bit gimmicky. I would encourage most people to use it over eval, but it should be used with care.