in reply to Sub prototypes...

This code:
try { die "foobar\n"; print "OK"; } catch { print "FAILED!\n"; };
Executes like this:
try( sub { die "Foobar"; print "OK"; }, catch(sub { print "FAILED!\n"; }) );
In other words, there are two arguments to try(): a coderef and whatever catch() returns (normally a coderef, its own first argument). So catch() has to be called before try() can be called.