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