better example for returning from a try block (forwardever)
[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
98904c59 13$VERSION = "0.10";
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
a5cd5f73 201context or the empty list in list context. The following two examples both
202assign C<"bar"> to C<$x>.
203
204 my $x = try { die "foo" } catch { "bar" };
205
206 my $x = eval { die "foo" } || "bar";
207
7195fc08 208You can add finally blocks making the following true.
209
210 my $x;
211 try { die 'foo' } finally { $x = 'bar' };
212 try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' };
213
214Finally blocks are always executed making them suitable for cleanup code
9610f171 215which cannot be handled using local. You can add as many finally blocks to a
b611f396 216given try block as you like.
7195fc08 217
3176feef 218=head1 EXPORTS
219
1f7c5af6 220All functions are exported by default using L<Exporter>.
3176feef 221
7195fc08 222If you need to rename the C<try>, C<catch> or C<finally> keyword consider using
6157bcb8 223L<Sub::Import> to get L<Sub::Exporter>'s flexibility.
3176feef 224
225=over 4
226
7195fc08 227=item try (&;@)
3176feef 228
7195fc08 229Takes one mandatory try subroutine, an optional catch subroutine & finally
230subroutine.
3176feef 231
232The mandatory subroutine is evaluated in the context of an C<eval> block.
233
1f7c5af6 234If no error occurred the value from the first block is returned, preserving
235list/scalar context.
3176feef 236
237If there was an error and the second subroutine was given it will be invoked
238with the error in C<$_> (localized) and as that block's first and only
239argument.
240
2dc64249 241C<$@> does B<not> contain the error. Inside the C<catch> block it has the same
242value it had before the C<try> block was executed.
243
1f7c5af6 244Note that the error may be false, but if that happens the C<catch> block will
1d64c1ad 245still be invoked.
3176feef 246
7195fc08 247Once all execution is finished then the finally block if given will execute.
248
249=item catch (&;$)
1f7c5af6 250
251Intended to be used in the second argument position of C<try>.
3176feef 252
7195fc08 253Returns a reference to the subroutine it was given but blessed as
254C<Try::Tiny::Catch> which allows try to decode correctly what to do
255with this code reference.
3176feef 256
257 catch { ... }
258
2dc64249 259Inside the catch block the caught error is stored in C<$_>, while previous
260value of C<$@> is still available for use. This value may or may not be
261meaningful depending on what happened before the C<try>, but it might be a good
262idea to preserve it in an error stack.
ac4f5f9f 263
0a0641f9 264For code that captures C<$@> when throwing new errors (i.e.
265L<Class::Throwable>), you'll need to do:
266
267 local $@ = $_;
268
7195fc08 269=item finally (&;$)
270
271 try { ... }
272 catch { ... }
273 finally { ... };
274
275Or
276
277 try { ... }
278 finally { ... };
279
280Or even
281
282 try { ... }
283 finally { ... }
284 catch { ... };
285
286Intended to be the second or third element of C<try>. Finally blocks are always
287executed in the event of a successful C<try> or if C<catch> is run. This allows
288you to locate cleanup code which cannot be done via C<local()> e.g. closing a file
289handle.
290
d6e0f0df 291When invoked, the finally block is passed the error that was caught. If no
658a90e5 292error was caught, it is passed nothing. (Note that the finally block does not
293localize C<$_> with the error, since unlike in a catch block, there is no way
294to know if C<$_ == undef> implies that there were no errors.) In other words,
295the following code does just what you would expect:
d6e0f0df 296
297 try {
298 die_sometimes();
299 } catch {
300 # ...code run in case of error
301 } finally {
302 if (@_) {
303 print "The try block died with: @_\n";
304 } else {
305 print "The try block ran without error.\n";
306 }
307 };
308
7195fc08 309B<You must always do your own error handling in the finally block>. C<Try::Tiny> will
310not do anything about handling possible errors coming from code located in these
311blocks.
312
313In the same way C<catch()> blesses the code reference this subroutine does the same
314except it bless them as C<Try::Tiny::Finally>.
315
3176feef 316=back
317
318=head1 BACKGROUND
319
320There are a number of issues with C<eval>.
321
322=head2 Clobbering $@
323
324When you run an eval block and it succeeds, C<$@> will be cleared, potentially
a717a876 325clobbering an error that is currently being caught.
3176feef 326
1f7c5af6 327This causes action at a distance, clearing previous errors your caller may have
328not yet handled.
329
330C<$@> must be properly localized before invoking C<eval> in order to avoid this
331issue.
3176feef 332
8e5b4441 333More specifically, C<$@> is clobbered at the beginning of the C<eval>, which
511c05ca 334also makes it impossible to capture the previous error before you die (for
335instance when making exception objects with error stacks).
336
337For this reason C<try> will actually set C<$@> to its previous value (before
1d64c1ad 338the localization) in the beginning of the C<eval> block.
511c05ca 339
3176feef 340=head2 Localizing $@ silently masks errors
341
342Inside an eval block C<die> behaves sort of like:
343
344 sub die {
91254b51 345 $@ = $_[0];
3176feef 346 return_undef_from_eval();
347 }
348
349This means that if you were polite and localized C<$@> you can't die in that
1f7c5af6 350scope, or your error will be discarded (printing "Something's wrong" instead).
3176feef 351
352The workaround is very ugly:
353
354 my $error = do {
355 local $@;
356 eval { ... };
357 $@;
358 };
359
360 ...
361 die $error;
362
363=head2 $@ might not be a true value
364
365This code is wrong:
366
367 if ( $@ ) {
368 ...
369 }
370
1f7c5af6 371because due to the previous caveats it may have been unset.
372
1d64c1ad 373C<$@> could also be an overloaded error object that evaluates to false, but
374that's asking for trouble anyway.
3176feef 375
376The classic failure mode is:
377
378 sub Object::DESTROY {
379 eval { ... }
380 }
381
382 eval {
383 my $obj = Object->new;
384
385 die "foo";
386 };
387
388 if ( $@ ) {
389
390 }
391
1f7c5af6 392In this case since C<Object::DESTROY> is not localizing C<$@> but still uses
1d64c1ad 393C<eval>, it will set C<$@> to C<"">.
3176feef 394
1f7c5af6 395The destructor is called when the stack is unwound, after C<die> sets C<$@> to
3176feef 396C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has
1f7c5af6 397been cleared by C<eval> in the destructor.
3176feef 398
1f7c5af6 399The workaround for this is even uglier than the previous ones. Even though we
400can't save the value of C<$@> from code that doesn't localize, we can at least
401be sure the eval was aborted due to an error:
3176feef 402
403 my $failed = not eval {
404 ...
405
406 return 1;
407 };
408
1f7c5af6 409This is because an C<eval> that caught a C<die> will always return a false
410value.
3176feef 411
f9b91e2c 412=head1 SHINY SYNTAX
3176feef 413
1f7c5af6 414Using Perl 5.10 you can use L<perlsyn/"Switch statements">.
3176feef 415
1f7c5af6 416The C<catch> block is invoked in a topicalizer context (like a C<given> block),
417but note that you can't return a useful value from C<catch> using the C<when>
27293e40 418blocks without an explicit C<return>.
3176feef 419
420This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to
421concisely match errors:
422
423 try {
424 require Foo;
425 } catch {
1f7c5af6 426 when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
3176feef 427 default { die $_ }
deb85b37 428 };
3176feef 429
430=head1 CAVEATS
431
432=over 4
433
434=item *
435
013dca8f 436C<@_> is not available within the C<try> block, so you need to copy your
437arglist. In case you want to work with argument values directly via C<@_>
438aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference:
318cb1eb 439
440 sub foo {
441 my ( $self, @args ) = @_;
442 try { $self->bar(@args) }
443 }
013dca8f 444
445or
446
447 sub bar_in_place {
448 my $self = shift;
449 my $args = \@_;
450 try { $_ = $self->bar($_) for @$args }
451 }
318cb1eb 452
453=item *
454
455C<return> returns from the C<try> block, not from the parent sub (note that
456this is also how C<eval> works, but not how L<TryCatch> works):
457
6651956b 458 sub parent_sub {
459 try {
460 die;
461 }
462 catch {
463 return;
464 };
465
466 say "this text WILL be displayed, even though an exception is thrown";
467 }
468
469Instead, you should capture the return value:
470
471 sub parent_sub {
472 my $success = try {
473 die;
474 1;
475 }
476 return unless $success;
477
478 say "This text WILL NEVER appear!";
479 }
318cb1eb 480
6651956b 481Note that if you have a catch block, it must return undef for this to work,
482since if a catch block exists, its return value is returned in place of undef
483when an exception is thrown.
318cb1eb 484
485=item *
486
1f7c5af6 487C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp>
c12e626f 488will not report this when using full stack traces, though, because
489C<%Carp::Internal> is used. This lack of magic is considered a feature.
3176feef 490
491=item *
492
57c50f41 493The value of C<$_> in the C<catch> block is not guaranteed to be the value of
494the exception thrown (C<$@>) in the C<try> block. There is no safe way to
495ensure this, since C<eval> may be used unhygenically in destructors. The only
496guarantee is that the C<catch> will be called if an exception is thrown.
3176feef 497
a5cd5f73 498=item *
499
500The return value of the C<catch> block is not ignored, so if testing the result
501of the expression for truth on success, be sure to return a false value from
502the C<catch> block:
503
504 my $obj = try {
505 MightFail->new;
506 } catch {
507 ...
508
509 return; # avoid returning a true value;
510 };
511
512 return unless $obj;
513
eaca95b7 514=item *
515
516C<$SIG{__DIE__}> is still in effect.
517
518Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of
519C<eval> blocks, since it isn't people have grown to rely on it. Therefore in
520the interests of compatibility, C<try> does not disable C<$SIG{__DIE__}> for
521the scope of the error throwing code.
522
cbfb5327 523=item *
524
525Lexical C<$_> may override the one set by C<catch>.
526
527For example Perl 5.10's C<given> form uses a lexical C<$_>, creating some
528confusing behavior:
529
530 given ($foo) {
531 when (...) {
532 try {
533 ...
534 } catch {
535 warn $_; # will print $foo, not the error
536 warn $_[0]; # instead, get the error like this
537 }
538 }
539 }
540
3176feef 541=back
542
543=head1 SEE ALSO
544
545=over 4
546
547=item L<TryCatch>
548
549Much more feature complete, more convenient semantics, but at the cost of
550implementation complexity.
551
9bc603cb 552=item L<autodie>
553
554Automatic error throwing for builtin functions and more. Also designed to
555work well with C<given>/C<when>.
556
f8227e43 557=item L<Throwable>
558
559A lightweight role for rolling your own exception classes.
560
3176feef 561=item L<Error>
562
563Exception object implementation with a C<try> statement. Does not localize
564C<$@>.
565
566=item L<Exception::Class::TryCatch>
567
568Provides a C<catch> statement, but properly calling C<eval> is your
569responsibility.
570
571The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the
1d64c1ad 572issues with C<$@>, but you still need to localize to prevent clobbering.
3176feef 573
574=back
575
faecd5a0 576=head1 LIGHTNING TALK
577
578I gave a lightning talk about this module, you can see the slides (Firefox
579only):
580
e9140680 581L<http://nothingmuch.woobling.org/talks/takahashi.xul?data=yapc_asia_2009/try_tiny.txt>
faecd5a0 582
583Or read the source:
584
585L<http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml>
586
3176feef 587=head1 VERSION CONTROL
588
589L<http://github.com/nothingmuch/try-tiny/>
590
591=head1 AUTHOR
592
593Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
594
595=head1 COPYRIGHT
596
c4e1eb12 597 Copyright (c) 2009 Yuval Kogman. All rights reserved.
3176feef 598 This program is free software; you can redistribute
c4e1eb12 599 it and/or modify it under the terms of the MIT license.
3176feef 600
601=cut
602