The construct introduced in 2b0d579d8 confuses perl 5.6 - simplify
[p5sagit/Try-Tiny.git] / lib / Try / Tiny.pm
CommitLineData
3176feef 1package Try::Tiny;
2
3use strict;
f9d19a00 4use warnings;
3176feef 5
f9d19a00 6our $VERSION = "0.12";
7$VERSION = eval $VERSION if $VERSION =~ /_/;
ae53da51 8
f9d19a00 9use base 'Exporter';
10our @EXPORT = our @EXPORT_OK = qw(try catch finally);
3176feef 11
f9d19a00 12use Carp;
6f114080 13$Carp::Internal{+__PACKAGE__}++;
14
7195fc08 15# Need to prototype as @ not $$ because of the way Perl evaluates the prototype.
16# Keeping it at $$ means you only ever get 1 sub because we need to eval in a list
17# context & not a scalar one
18
19sub try (&;@) {
8d2ee831 20 my ( $try, @code_refs ) = @_;
21
22 # we need to save this here, the eval block will be in scalar context due
23 # to $failed
24 my $wantarray = wantarray;
25
26 my ( $catch, @finally );
27
28 # find labeled blocks in the argument list.
29 # catch and finally tag the blocks by blessing a scalar reference to them.
30 foreach my $code_ref (@code_refs) {
8d2ee831 31
4c5b99d6 32 if ( ref($code_ref) eq 'Try::Tiny::Catch' ) {
9d0e0466 33 croak 'A try() may not be followed by multiple catch() blocks'
34 if $catch;
8d2ee831 35 $catch = ${$code_ref};
4c5b99d6 36 } elsif ( ref($code_ref) eq 'Try::Tiny::Finally' ) {
8d2ee831 37 push @finally, ${$code_ref};
38 } else {
4c5b99d6 39 croak(
40 'try() encountered an unexpected argument ('
41 . ( defined $code_ref ? $code_ref : 'undef' )
42 . ') - perhaps a missing semi-colon before or'
43 );
8d2ee831 44 }
45 }
46
2b0d579d 47 # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's
48 # not perfect, but we could provide a list of additional errors for
49 # $catch->();
50
8d2ee831 51 # save the value of $@ so we can set $@ back to it in the beginning of the eval
2b0d579d 52 # and restore $@ after the eval finishes
8d2ee831 53 my $prev_error = $@;
54
2b0d579d 55 my ( @ret, $error );
8d2ee831 56
2b0d579d 57 # failed will be true if the eval dies, because 1 will not be returned
58 # from the eval body
59 my $failed = not eval {
60 $@ = $prev_error;
8d2ee831 61
2b0d579d 62 # evaluate the try block in the correct context
63 if ( $wantarray ) {
64 @ret = $try->();
65 } elsif ( defined $wantarray ) {
66 $ret[0] = $try->();
67 } else {
68 $try->();
8d2ee831 69 };
70
2b0d579d 71 return 1; # properly set $fail to false
3db0dca6 72 };
2b0d579d 73
3db0dca6 74 # preserve the current error and reset the original value of $@
75 $error = $@;
2b0d579d 76 $@ = $prev_error;
8d2ee831 77
78 # set up a scope guard to invoke the finally block at the end
79 my @guards =
b611f396 80 map { Try::Tiny::ScopeGuard->_new($_, $failed ? $error : ()) }
81 @finally;
82ef0e61 82
8d2ee831 83 # at this point $failed contains a true value if the eval died, even if some
84 # destructor overwrote $@ as the eval was unwinding.
85 if ( $failed ) {
86 # if we got an error, invoke the catch block.
87 if ( $catch ) {
88 # This works like given($error), but is backwards compatible and
89 # sets $_ in the dynamic scope for the body of C<$catch>
90 for ($error) {
91 return $catch->($error);
92 }
93
94 # in case when() was used without an explicit return, the C<for>
95 # loop will be aborted and there's no useful return value
96 }
97
98 return;
99 } else {
100 # no failure, $@ is back to what it was, everything is fine
101 return $wantarray ? @ret : $ret[0];
102 }
3176feef 103}
104
7195fc08 105sub catch (&;@) {
8d2ee831 106 my ( $block, @rest ) = @_;
7195fc08 107
9d0e0466 108 croak 'Useless bare catch()' unless defined wantarray;
109
8d2ee831 110 return (
111 bless(\$block, 'Try::Tiny::Catch'),
112 @rest,
113 );
3176feef 114}
115
7195fc08 116sub finally (&;@) {
8d2ee831 117 my ( $block, @rest ) = @_;
7195fc08 118
9d0e0466 119 croak 'Useless bare finally()' unless defined wantarray;
120
8d2ee831 121 return (
122 bless(\$block, 'Try::Tiny::Finally'),
123 @rest,
124 );
7195fc08 125}
3176feef 126
b611f396 127{
3ef3a4f0 128 package # hide from PAUSE
129 Try::Tiny::ScopeGuard;
b611f396 130
5f5e92c0 131 use constant UNSTABLE_DOLLARAT => ($] < '5.013002') ? 1 : 0;
132
b611f396 133 sub _new {
134 shift;
135 bless [ @_ ];
136 }
137
138 sub DESTROY {
5f5e92c0 139 my ($code, @args) = @{ $_[0] };
140
141 local $@ if UNSTABLE_DOLLARAT;
142 eval {
143 $code->(@args);
144 1;
145 } or do {
146 warn
147 "Execution of finally() block $code resulted in an exception, which "
148 . '*CAN NOT BE PROPAGATED* due to fundamental limitations of Perl. '
149 . 'Your program will continue as if this event never took place. '
150 . "Original exception text follows:\n\n"
151 . (defined $@ ? $@ : '$@ left undefined...')
152 . "\n"
153 ;
154 }
b611f396 155 }
82ef0e61 156}
157
3176feef 158__PACKAGE__
159
160__END__
161
162=pod
163
164=head1 NAME
165
2b0d579d 166Try::Tiny - minimal try/catch with proper preservation of $@
3176feef 167
168=head1 SYNOPSIS
169
a2358317 170You can use Try::Tiny's C<try> and C<catch> to expect and handle exceptional
171conditions, avoiding quirks in Perl and common mistakes:
172
8d2ee831 173 # handle errors with a catch handler
174 try {
175 die "foo";
176 } catch {
177 warn "caught error: $_"; # not $@
178 };
3176feef 179
b999823d 180You can also use it like a standalone C<eval> to catch and ignore any error
a2358317 181conditions. Obviously, this is an extreme measure not to be undertaken
182lightly:
183
8d2ee831 184 # just silence errors
185 try {
186 die "foo";
187 };
3176feef 188
189=head1 DESCRIPTION
190
7195fc08 191This module provides bare bones C<try>/C<catch>/C<finally> statements that are designed to
1f7c5af6 192minimize common mistakes with eval blocks, and NOTHING else.
3176feef 193
194This is unlike L<TryCatch> which provides a nice syntax and avoids adding
ad10a9e2 195another call stack layer, and supports calling C<return> from the C<try> block to
3176feef 196return from the parent subroutine. These extra features come at a cost of a few
197dependencies, namely L<Devel::Declare> and L<Scope::Upper> which are
1f7c5af6 198occasionally problematic, and the additional catch filtering uses L<Moose>
199type constraints which may not be desirable either.
3176feef 200
1f7c5af6 201The main focus of this module is to provide simple and reliable error handling
3176feef 202for those having a hard time installing L<TryCatch>, but who still want to
203write correct C<eval> blocks without 5 lines of boilerplate each time.
204
205It's designed to work as correctly as possible in light of the various
b999823d 206pathological edge cases (see L</BACKGROUND>) and to be compatible with any style
3176feef 207of error values (simple strings, references, objects, overloaded objects, etc).
208
ad10a9e2 209If the C<try> block dies, it returns the value of the last statement executed in
210the C<catch> block, if there is one. Otherwise, it returns C<undef> in scalar
c065237e 211context or the empty list in list context. The following examples all
ad10a9e2 212assign C<"bar"> to C<$x>:
a5cd5f73 213
8d2ee831 214 my $x = try { die "foo" } catch { "bar" };
215 my $x = try { die "foo" } || { "bar" };
216 my $x = (try { die "foo" }) // { "bar" };
a5cd5f73 217
8d2ee831 218 my $x = eval { die "foo" } || "bar";
a5cd5f73 219
ad10a9e2 220You can add C<finally> blocks, yielding the following:
7195fc08 221
8d2ee831 222 my $x;
223 try { die 'foo' } finally { $x = 'bar' };
224 try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' };
7195fc08 225
ad10a9e2 226C<finally> blocks are always executed making them suitable for cleanup code
227which cannot be handled using local. You can add as many C<finally> blocks to a
228given C<try> block as you like.
7195fc08 229
3176feef 230=head1 EXPORTS
231
1f7c5af6 232All functions are exported by default using L<Exporter>.
3176feef 233
7195fc08 234If you need to rename the C<try>, C<catch> or C<finally> keyword consider using
6157bcb8 235L<Sub::Import> to get L<Sub::Exporter>'s flexibility.
3176feef 236
237=over 4
238
7195fc08 239=item try (&;@)
3176feef 240
ad10a9e2 241Takes one mandatory C<try> subroutine, an optional C<catch> subroutine and C<finally>
7195fc08 242subroutine.
3176feef 243
244The mandatory subroutine is evaluated in the context of an C<eval> block.
245
1f7c5af6 246If no error occurred the value from the first block is returned, preserving
247list/scalar context.
3176feef 248
249If there was an error and the second subroutine was given it will be invoked
250with the error in C<$_> (localized) and as that block's first and only
251argument.
252
2dc64249 253C<$@> does B<not> contain the error. Inside the C<catch> block it has the same
254value it had before the C<try> block was executed.
255
1f7c5af6 256Note that the error may be false, but if that happens the C<catch> block will
1d64c1ad 257still be invoked.
3176feef 258
ad10a9e2 259Once all execution is finished then the C<finally> block, if given, will execute.
7195fc08 260
ae5ed1be 261=item catch (&;@)
1f7c5af6 262
263Intended to be used in the second argument position of C<try>.
3176feef 264
7195fc08 265Returns a reference to the subroutine it was given but blessed as
266C<Try::Tiny::Catch> which allows try to decode correctly what to do
267with this code reference.
3176feef 268
8d2ee831 269 catch { ... }
3176feef 270
ad10a9e2 271Inside the C<catch> block the caught error is stored in C<$_>, while previous
2dc64249 272value of C<$@> is still available for use. This value may or may not be
273meaningful depending on what happened before the C<try>, but it might be a good
274idea to preserve it in an error stack.
ac4f5f9f 275
0a0641f9 276For code that captures C<$@> when throwing new errors (i.e.
277L<Class::Throwable>), you'll need to do:
278
8d2ee831 279 local $@ = $_;
0a0641f9 280
ae5ed1be 281=item finally (&;@)
7195fc08 282
283 try { ... }
284 catch { ... }
285 finally { ... };
286
287Or
288
289 try { ... }
290 finally { ... };
291
292Or even
293
294 try { ... }
295 finally { ... }
296 catch { ... };
297
ad10a9e2 298Intended to be the second or third element of C<try>. C<finally> blocks are always
7195fc08 299executed in the event of a successful C<try> or if C<catch> is run. This allows
300you to locate cleanup code which cannot be done via C<local()> e.g. closing a file
301handle.
302
ad10a9e2 303When invoked, the C<finally> block is passed the error that was caught. If no
304error was caught, it is passed nothing. (Note that the C<finally> block does not
305localize C<$_> with the error, since unlike in a C<catch> block, there is no way
658a90e5 306to know if C<$_ == undef> implies that there were no errors.) In other words,
307the following code does just what you would expect:
d6e0f0df 308
309 try {
310 die_sometimes();
311 } catch {
312 # ...code run in case of error
313 } finally {
314 if (@_) {
315 print "The try block died with: @_\n";
316 } else {
317 print "The try block ran without error.\n";
318 }
319 };
320
ad10a9e2 321B<You must always do your own error handling in the C<finally> block>. C<Try::Tiny> will
7195fc08 322not do anything about handling possible errors coming from code located in these
323blocks.
324
5f5e92c0 325Furthermore B<exceptions in C<finally> blocks are not trappable and are unable
326to influence the execution of your program>. This is due to limitation of
327C<DESTROY>-based scope guards, which C<finally> is implemented on top of. This
328may change in a future version of Try::Tiny.
329
7195fc08 330In the same way C<catch()> blesses the code reference this subroutine does the same
331except it bless them as C<Try::Tiny::Finally>.
332
3176feef 333=back
334
335=head1 BACKGROUND
336
337There are a number of issues with C<eval>.
338
339=head2 Clobbering $@
340
ad10a9e2 341When you run an C<eval> block and it succeeds, C<$@> will be cleared, potentially
a717a876 342clobbering an error that is currently being caught.
3176feef 343
1f7c5af6 344This causes action at a distance, clearing previous errors your caller may have
345not yet handled.
346
347C<$@> must be properly localized before invoking C<eval> in order to avoid this
348issue.
3176feef 349
8e5b4441 350More specifically, C<$@> is clobbered at the beginning of the C<eval>, which
511c05ca 351also makes it impossible to capture the previous error before you die (for
352instance when making exception objects with error stacks).
353
2b0d579d 354For this reason C<try> will actually set C<$@> to its previous value (the one
355available before entering the C<try> block) in the beginning of the C<eval>
356block.
511c05ca 357
3176feef 358=head2 Localizing $@ silently masks errors
359
ad10a9e2 360Inside an C<eval> block, C<die> behaves sort of like:
3176feef 361
8d2ee831 362 sub die {
363 $@ = $_[0];
364 return_undef_from_eval();
365 }
3176feef 366
367This means that if you were polite and localized C<$@> you can't die in that
1f7c5af6 368scope, or your error will be discarded (printing "Something's wrong" instead).
3176feef 369
370The workaround is very ugly:
371
8d2ee831 372 my $error = do {
373 local $@;
374 eval { ... };
375 $@;
376 };
3176feef 377
8d2ee831 378 ...
379 die $error;
3176feef 380
381=head2 $@ might not be a true value
382
383This code is wrong:
384
8d2ee831 385 if ( $@ ) {
386 ...
387 }
3176feef 388
1f7c5af6 389because due to the previous caveats it may have been unset.
390
1d64c1ad 391C<$@> could also be an overloaded error object that evaluates to false, but
392that's asking for trouble anyway.
3176feef 393
394The classic failure mode is:
395
8d2ee831 396 sub Object::DESTROY {
397 eval { ... }
398 }
3176feef 399
8d2ee831 400 eval {
401 my $obj = Object->new;
3176feef 402
8d2ee831 403 die "foo";
404 };
3176feef 405
8d2ee831 406 if ( $@ ) {
3176feef 407
8d2ee831 408 }
3176feef 409
1f7c5af6 410In this case since C<Object::DESTROY> is not localizing C<$@> but still uses
1d64c1ad 411C<eval>, it will set C<$@> to C<"">.
3176feef 412
1f7c5af6 413The destructor is called when the stack is unwound, after C<die> sets C<$@> to
3176feef 414C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has
1f7c5af6 415been cleared by C<eval> in the destructor.
3176feef 416
1f7c5af6 417The workaround for this is even uglier than the previous ones. Even though we
418can't save the value of C<$@> from code that doesn't localize, we can at least
ad10a9e2 419be sure the C<eval> was aborted due to an error:
3176feef 420
8d2ee831 421 my $failed = not eval {
422 ...
3176feef 423
8d2ee831 424 return 1;
425 };
3176feef 426
1f7c5af6 427This is because an C<eval> that caught a C<die> will always return a false
428value.
3176feef 429
f9b91e2c 430=head1 SHINY SYNTAX
3176feef 431
1f7c5af6 432Using Perl 5.10 you can use L<perlsyn/"Switch statements">.
3176feef 433
1f7c5af6 434The C<catch> block is invoked in a topicalizer context (like a C<given> block),
435but note that you can't return a useful value from C<catch> using the C<when>
27293e40 436blocks without an explicit C<return>.
3176feef 437
438This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to
439concisely match errors:
440
8d2ee831 441 try {
442 require Foo;
443 } catch {
444 when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
445 default { die $_ }
446 };
3176feef 447
448=head1 CAVEATS
449
450=over 4
451
452=item *
453
013dca8f 454C<@_> is not available within the C<try> block, so you need to copy your
455arglist. In case you want to work with argument values directly via C<@_>
456aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference:
318cb1eb 457
8d2ee831 458 sub foo {
459 my ( $self, @args ) = @_;
460 try { $self->bar(@args) }
461 }
013dca8f 462
463or
464
8d2ee831 465 sub bar_in_place {
466 my $self = shift;
467 my $args = \@_;
468 try { $_ = $self->bar($_) for @$args }
469 }
318cb1eb 470
471=item *
472
473C<return> returns from the C<try> block, not from the parent sub (note that
474this is also how C<eval> works, but not how L<TryCatch> works):
475
6651956b 476 sub parent_sub {
8d2ee831 477 try {
478 die;
479 }
480 catch {
481 return;
482 };
6651956b 483
8d2ee831 484 say "this text WILL be displayed, even though an exception is thrown";
6651956b 485 }
486
487Instead, you should capture the return value:
488
489 sub parent_sub {
8d2ee831 490 my $success = try {
491 die;
492 1;
493 }
494 return unless $success;
6651956b 495
8d2ee831 496 say "This text WILL NEVER appear!";
6651956b 497 }
318cb1eb 498
ad10a9e2 499Note that if you have a C<catch> block, it must return C<undef> for this to work,
500since if a C<catch> block exists, its return value is returned in place of C<undef>
6651956b 501when an exception is thrown.
318cb1eb 502
503=item *
504
1f7c5af6 505C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp>
c12e626f 506will not report this when using full stack traces, though, because
507C<%Carp::Internal> is used. This lack of magic is considered a feature.
3176feef 508
509=item *
510
57c50f41 511The value of C<$_> in the C<catch> block is not guaranteed to be the value of
512the exception thrown (C<$@>) in the C<try> block. There is no safe way to
513ensure this, since C<eval> may be used unhygenically in destructors. The only
514guarantee is that the C<catch> will be called if an exception is thrown.
3176feef 515
a5cd5f73 516=item *
517
518The return value of the C<catch> block is not ignored, so if testing the result
519of the expression for truth on success, be sure to return a false value from
520the C<catch> block:
521
8d2ee831 522 my $obj = try {
523 MightFail->new;
524 } catch {
525 ...
a5cd5f73 526
8d2ee831 527 return; # avoid returning a true value;
528 };
a5cd5f73 529
8d2ee831 530 return unless $obj;
a5cd5f73 531
eaca95b7 532=item *
533
534C<$SIG{__DIE__}> is still in effect.
535
536Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of
537C<eval> blocks, since it isn't people have grown to rely on it. Therefore in
538the interests of compatibility, C<try> does not disable C<$SIG{__DIE__}> for
539the scope of the error throwing code.
540
cbfb5327 541=item *
542
543Lexical C<$_> may override the one set by C<catch>.
544
545For example Perl 5.10's C<given> form uses a lexical C<$_>, creating some
546confusing behavior:
547
8d2ee831 548 given ($foo) {
549 when (...) {
550 try {
551 ...
552 } catch {
553 warn $_; # will print $foo, not the error
554 warn $_[0]; # instead, get the error like this
555 }
556 }
557 }
cbfb5327 558
aaf0d61f 559Note that this behavior was changed once again in L<Perl5 version 18
560|https://metacpan.org/module/perldelta#given-now-aliases-the-global-_>.
561However, since the entirety of lexical C<$_> is now L<considired experimental
562|https://metacpan.org/module/perldelta#Lexical-_-is-now-experimental>, it
563is unclear whether the new version 18 behavior is final.
564
3176feef 565=back
566
567=head1 SEE ALSO
568
569=over 4
570
571=item L<TryCatch>
572
573Much more feature complete, more convenient semantics, but at the cost of
574implementation complexity.
575
9bc603cb 576=item L<autodie>
577
578Automatic error throwing for builtin functions and more. Also designed to
579work well with C<given>/C<when>.
580
f8227e43 581=item L<Throwable>
582
583A lightweight role for rolling your own exception classes.
584
3176feef 585=item L<Error>
586
587Exception object implementation with a C<try> statement. Does not localize
588C<$@>.
589
590=item L<Exception::Class::TryCatch>
591
592Provides a C<catch> statement, but properly calling C<eval> is your
593responsibility.
594
595The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the
1d64c1ad 596issues with C<$@>, but you still need to localize to prevent clobbering.
3176feef 597
598=back
599
faecd5a0 600=head1 LIGHTNING TALK
601
602I gave a lightning talk about this module, you can see the slides (Firefox
603only):
604
2245f1ae 605L<web.archive.org/web/20100628040134/http://nothingmuch.woobling.org/talks/takahashi.xul>
faecd5a0 606
607Or read the source:
608
2245f1ae 609L<http://web.archive.org/web/20100305133605/http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml>
faecd5a0 610
3176feef 611=head1 VERSION CONTROL
612
613L<http://github.com/nothingmuch/try-tiny/>
614
615=head1 AUTHOR
616
617Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
618
619=head1 COPYRIGHT
620
8d2ee831 621 Copyright (c) 2009 Yuval Kogman. All rights reserved.
622 This program is free software; you can redistribute
623 it and/or modify it under the terms of the MIT license.
3176feef 624
625=cut
626