caveat about error-silencing
[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
308df09e 13$VERSION = "0.09";
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
292error was caught, it is passed nothing. In other words, the following code
293does just what you would expect:
294
295 try {
296 die_sometimes();
297 } catch {
298 # ...code run in case of error
299 } finally {
300 if (@_) {
301 print "The try block died with: @_\n";
302 } else {
303 print "The try block ran without error.\n";
304 }
305 };
306
7195fc08 307B<You must always do your own error handling in the finally block>. C<Try::Tiny> will
308not do anything about handling possible errors coming from code located in these
309blocks.
310
311In the same way C<catch()> blesses the code reference this subroutine does the same
312except it bless them as C<Try::Tiny::Finally>.
313
3176feef 314=back
315
316=head1 BACKGROUND
317
318There are a number of issues with C<eval>.
319
320=head2 Clobbering $@
321
322When you run an eval block and it succeeds, C<$@> will be cleared, potentially
a717a876 323clobbering an error that is currently being caught.
3176feef 324
1f7c5af6 325This causes action at a distance, clearing previous errors your caller may have
326not yet handled.
327
328C<$@> must be properly localized before invoking C<eval> in order to avoid this
329issue.
3176feef 330
8e5b4441 331More specifically, C<$@> is clobbered at the beginning of the C<eval>, which
511c05ca 332also makes it impossible to capture the previous error before you die (for
333instance when making exception objects with error stacks).
334
335For this reason C<try> will actually set C<$@> to its previous value (before
1d64c1ad 336the localization) in the beginning of the C<eval> block.
511c05ca 337
3176feef 338=head2 Localizing $@ silently masks errors
339
340Inside an eval block C<die> behaves sort of like:
341
342 sub die {
91254b51 343 $@ = $_[0];
3176feef 344 return_undef_from_eval();
345 }
346
347This means that if you were polite and localized C<$@> you can't die in that
1f7c5af6 348scope, or your error will be discarded (printing "Something's wrong" instead).
3176feef 349
350The workaround is very ugly:
351
352 my $error = do {
353 local $@;
354 eval { ... };
355 $@;
356 };
357
358 ...
359 die $error;
360
361=head2 $@ might not be a true value
362
363This code is wrong:
364
365 if ( $@ ) {
366 ...
367 }
368
1f7c5af6 369because due to the previous caveats it may have been unset.
370
1d64c1ad 371C<$@> could also be an overloaded error object that evaluates to false, but
372that's asking for trouble anyway.
3176feef 373
374The classic failure mode is:
375
376 sub Object::DESTROY {
377 eval { ... }
378 }
379
380 eval {
381 my $obj = Object->new;
382
383 die "foo";
384 };
385
386 if ( $@ ) {
387
388 }
389
1f7c5af6 390In this case since C<Object::DESTROY> is not localizing C<$@> but still uses
1d64c1ad 391C<eval>, it will set C<$@> to C<"">.
3176feef 392
1f7c5af6 393The destructor is called when the stack is unwound, after C<die> sets C<$@> to
3176feef 394C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has
1f7c5af6 395been cleared by C<eval> in the destructor.
3176feef 396
1f7c5af6 397The workaround for this is even uglier than the previous ones. Even though we
398can't save the value of C<$@> from code that doesn't localize, we can at least
399be sure the eval was aborted due to an error:
3176feef 400
401 my $failed = not eval {
402 ...
403
404 return 1;
405 };
406
1f7c5af6 407This is because an C<eval> that caught a C<die> will always return a false
408value.
3176feef 409
f9b91e2c 410=head1 SHINY SYNTAX
3176feef 411
1f7c5af6 412Using Perl 5.10 you can use L<perlsyn/"Switch statements">.
3176feef 413
1f7c5af6 414The C<catch> block is invoked in a topicalizer context (like a C<given> block),
415but note that you can't return a useful value from C<catch> using the C<when>
27293e40 416blocks without an explicit C<return>.
3176feef 417
418This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to
419concisely match errors:
420
421 try {
422 require Foo;
423 } catch {
1f7c5af6 424 when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
3176feef 425 default { die $_ }
deb85b37 426 };
3176feef 427
428=head1 CAVEATS
429
430=over 4
431
432=item *
433
013dca8f 434C<@_> is not available within the C<try> block, so you need to copy your
435arglist. In case you want to work with argument values directly via C<@_>
436aliasing (i.e. allow C<$_[1] = "foo">), you need to pass C<@_> by reference:
318cb1eb 437
438 sub foo {
439 my ( $self, @args ) = @_;
440 try { $self->bar(@args) }
441 }
013dca8f 442
443or
444
445 sub bar_in_place {
446 my $self = shift;
447 my $args = \@_;
448 try { $_ = $self->bar($_) for @$args }
449 }
318cb1eb 450
451=item *
452
453C<return> returns from the C<try> block, not from the parent sub (note that
454this is also how C<eval> works, but not how L<TryCatch> works):
455
456 sub bar {
457 try { return "foo" };
458 return "baz";
459 }
460
461 say bar(); # "baz"
462
463=item *
464
1f7c5af6 465C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp>
c12e626f 466will not report this when using full stack traces, though, because
467C<%Carp::Internal> is used. This lack of magic is considered a feature.
3176feef 468
469=item *
470
57c50f41 471The value of C<$_> in the C<catch> block is not guaranteed to be the value of
472the exception thrown (C<$@>) in the C<try> block. There is no safe way to
473ensure this, since C<eval> may be used unhygenically in destructors. The only
474guarantee is that the C<catch> will be called if an exception is thrown.
3176feef 475
a5cd5f73 476=item *
477
478The return value of the C<catch> block is not ignored, so if testing the result
479of the expression for truth on success, be sure to return a false value from
480the C<catch> block:
481
482 my $obj = try {
483 MightFail->new;
484 } catch {
485 ...
486
487 return; # avoid returning a true value;
488 };
489
490 return unless $obj;
491
eaca95b7 492=item *
493
494C<$SIG{__DIE__}> is still in effect.
495
496Though it can be argued that C<$SIG{__DIE__}> should be disabled inside of
497C<eval> blocks, since it isn't people have grown to rely on it. Therefore in
498the interests of compatibility, C<try> does not disable C<$SIG{__DIE__}> for
499the scope of the error throwing code.
500
cbfb5327 501=item *
502
503Lexical C<$_> may override the one set by C<catch>.
504
505For example Perl 5.10's C<given> form uses a lexical C<$_>, creating some
506confusing behavior:
507
508 given ($foo) {
509 when (...) {
510 try {
511 ...
512 } catch {
513 warn $_; # will print $foo, not the error
514 warn $_[0]; # instead, get the error like this
515 }
516 }
517 }
518
3176feef 519=back
520
521=head1 SEE ALSO
522
523=over 4
524
525=item L<TryCatch>
526
527Much more feature complete, more convenient semantics, but at the cost of
528implementation complexity.
529
9bc603cb 530=item L<autodie>
531
532Automatic error throwing for builtin functions and more. Also designed to
533work well with C<given>/C<when>.
534
f8227e43 535=item L<Throwable>
536
537A lightweight role for rolling your own exception classes.
538
3176feef 539=item L<Error>
540
541Exception object implementation with a C<try> statement. Does not localize
542C<$@>.
543
544=item L<Exception::Class::TryCatch>
545
546Provides a C<catch> statement, but properly calling C<eval> is your
547responsibility.
548
549The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the
1d64c1ad 550issues with C<$@>, but you still need to localize to prevent clobbering.
3176feef 551
552=back
553
faecd5a0 554=head1 LIGHTNING TALK
555
556I gave a lightning talk about this module, you can see the slides (Firefox
557only):
558
e9140680 559L<http://nothingmuch.woobling.org/talks/takahashi.xul?data=yapc_asia_2009/try_tiny.txt>
faecd5a0 560
561Or read the source:
562
563L<http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml>
564
3176feef 565=head1 VERSION CONTROL
566
567L<http://github.com/nothingmuch/try-tiny/>
568
569=head1 AUTHOR
570
571Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
572
573=head1 COPYRIGHT
574
c4e1eb12 575 Copyright (c) 2009 Yuval Kogman. All rights reserved.
3176feef 576 This program is free software; you can redistribute
c4e1eb12 577 it and/or modify it under the terms of the MIT license.
3176feef 578
579=cut
580