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