Add support for 'finally' blocks
[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
7c33c026 13$VERSION = "0.02";
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
7195fc08 32 my ( $catch, $finally );
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' ) {
44 $finally = ${$code_ref};
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
1d64c1ad 87 # at this point $failed contains a true value if the eval died, even if some
88 # destructor overwrote $@ as the eval was unwinding.
3176feef 89 if ( $failed ) {
90 # if we got an error, invoke the catch block.
91 if ( $catch ) {
92 # This works like given($error), but is backwards compatible and
93 # sets $_ in the dynamic scope for the body of C<$catch>
94 for ($error) {
7195fc08 95 my $catch_return = $catch->($error);
96
97 # Finally blocks run after all other blocks so it is executed here
98 $finally->() if ( $finally );
99
100 #And return whatever catch returned
101 return $catch_return;
3176feef 102 }
44599111 103
104 # in case when() was used without an explicit return, the C<for>
105 # loop will be aborted and there's no useful return value
3176feef 106 }
44599111 107
108 return;
3176feef 109 } else {
7195fc08 110 # Execute finally block once we decided we worked
111 $finally->() if ( $finally );
112
3176feef 113 # no failure, $@ is back to what it was, everything is fine
114 return $wantarray ? @ret : $ret[0];
115 }
116}
117
7195fc08 118sub catch (&;@) {
119 my ( $block, @rest ) = @_;
120
121 return (
122 bless(\$block, 'Try::Tiny::Catch'),
123 @rest,
124 );
3176feef 125}
126
7195fc08 127sub finally (&;@) {
128 my ( $block, @rest ) = @_;
129
130 return (
131 bless(\$block, 'Try::Tiny::Finally'),
132 @rest,
133 );
134}
3176feef 135
136__PACKAGE__
137
138__END__
139
140=pod
141
142=head1 NAME
143
144Try::Tiny - minimal try/catch with proper localization of $@
145
146=head1 SYNOPSIS
147
148 # handle errors with a catch handler
149 try {
150 die "foo";
151 } catch {
152 warn "caught error: $_";
153 };
154
155 # just silence errors
156 try {
157 die "foo";
158 };
159
160=head1 DESCRIPTION
161
7195fc08 162This module provides bare bones C<try>/C<catch>/C<finally> statements that are designed to
1f7c5af6 163minimize common mistakes with eval blocks, and NOTHING else.
3176feef 164
165This is unlike L<TryCatch> which provides a nice syntax and avoids adding
166another call stack layer, and supports calling C<return> from the try block to
167return from the parent subroutine. These extra features come at a cost of a few
168dependencies, namely L<Devel::Declare> and L<Scope::Upper> which are
1f7c5af6 169occasionally problematic, and the additional catch filtering uses L<Moose>
170type constraints which may not be desirable either.
3176feef 171
1f7c5af6 172The main focus of this module is to provide simple and reliable error handling
3176feef 173for those having a hard time installing L<TryCatch>, but who still want to
174write correct C<eval> blocks without 5 lines of boilerplate each time.
175
176It's designed to work as correctly as possible in light of the various
177pathological edge cases (see L<BACKGROUND>) and to be compatible with any style
178of error values (simple strings, references, objects, overloaded objects, etc).
179
a5cd5f73 180If the try block dies, it returns the value of the last statement executed in
7195fc08 181the catch block, if there is one. Otherwise, it returns C<undef> in scalar
a5cd5f73 182context or the empty list in list context. The following two examples both
183assign C<"bar"> to C<$x>.
184
185 my $x = try { die "foo" } catch { "bar" };
186
187 my $x = eval { die "foo" } || "bar";
188
7195fc08 189You can add finally blocks making the following true.
190
191 my $x;
192 try { die 'foo' } finally { $x = 'bar' };
193 try { die 'foo' } catch { warn "Got a die: $_" } finally { $x = 'bar' };
194
195Finally blocks are always executed making them suitable for cleanup code
196which cannot be handled using local.
197
3176feef 198=head1 EXPORTS
199
1f7c5af6 200All functions are exported by default using L<Exporter>.
3176feef 201
7195fc08 202If you need to rename the C<try>, C<catch> or C<finally> keyword consider using
6157bcb8 203L<Sub::Import> to get L<Sub::Exporter>'s flexibility.
3176feef 204
205=over 4
206
7195fc08 207=item try (&;@)
3176feef 208
7195fc08 209Takes one mandatory try subroutine, an optional catch subroutine & finally
210subroutine.
3176feef 211
212The mandatory subroutine is evaluated in the context of an C<eval> block.
213
1f7c5af6 214If no error occurred the value from the first block is returned, preserving
215list/scalar context.
3176feef 216
217If there was an error and the second subroutine was given it will be invoked
218with the error in C<$_> (localized) and as that block's first and only
219argument.
220
1f7c5af6 221Note that the error may be false, but if that happens the C<catch> block will
1d64c1ad 222still be invoked.
3176feef 223
7195fc08 224Once all execution is finished then the finally block if given will execute.
225
226=item catch (&;$)
1f7c5af6 227
228Intended to be used in the second argument position of C<try>.
3176feef 229
7195fc08 230Returns a reference to the subroutine it was given but blessed as
231C<Try::Tiny::Catch> which allows try to decode correctly what to do
232with this code reference.
3176feef 233
234 catch { ... }
235
ac4f5f9f 236Inside the catch block the previous value of C<$@> is still available for use.
1d64c1ad 237This value may or may not be meaningful depending on what happened before the
ac4f5f9f 238C<try>, but it might be a good idea to preserve it in an error stack.
239
7195fc08 240=item finally (&;$)
241
242 try { ... }
243 catch { ... }
244 finally { ... };
245
246Or
247
248 try { ... }
249 finally { ... };
250
251Or even
252
253 try { ... }
254 finally { ... }
255 catch { ... };
256
257Intended to be the second or third element of C<try>. Finally blocks are always
258executed in the event of a successful C<try> or if C<catch> is run. This allows
259you to locate cleanup code which cannot be done via C<local()> e.g. closing a file
260handle.
261
262B<You must always do your own error handling in the finally block>. C<Try::Tiny> will
263not do anything about handling possible errors coming from code located in these
264blocks.
265
266In the same way C<catch()> blesses the code reference this subroutine does the same
267except it bless them as C<Try::Tiny::Finally>.
268
3176feef 269=back
270
271=head1 BACKGROUND
272
273There are a number of issues with C<eval>.
274
275=head2 Clobbering $@
276
277When you run an eval block and it succeeds, C<$@> will be cleared, potentially
a717a876 278clobbering an error that is currently being caught.
3176feef 279
1f7c5af6 280This causes action at a distance, clearing previous errors your caller may have
281not yet handled.
282
283C<$@> must be properly localized before invoking C<eval> in order to avoid this
284issue.
3176feef 285
511c05ca 286More specifically, C<$@> is clobbered at the begining of the C<eval>, which
287also makes it impossible to capture the previous error before you die (for
288instance when making exception objects with error stacks).
289
290For this reason C<try> will actually set C<$@> to its previous value (before
1d64c1ad 291the localization) in the beginning of the C<eval> block.
511c05ca 292
3176feef 293=head2 Localizing $@ silently masks errors
294
295Inside an eval block C<die> behaves sort of like:
296
297 sub die {
91254b51 298 $@ = $_[0];
3176feef 299 return_undef_from_eval();
300 }
301
302This means that if you were polite and localized C<$@> you can't die in that
1f7c5af6 303scope, or your error will be discarded (printing "Something's wrong" instead).
3176feef 304
305The workaround is very ugly:
306
307 my $error = do {
308 local $@;
309 eval { ... };
310 $@;
311 };
312
313 ...
314 die $error;
315
316=head2 $@ might not be a true value
317
318This code is wrong:
319
320 if ( $@ ) {
321 ...
322 }
323
1f7c5af6 324because due to the previous caveats it may have been unset.
325
1d64c1ad 326C<$@> could also be an overloaded error object that evaluates to false, but
327that's asking for trouble anyway.
3176feef 328
329The classic failure mode is:
330
331 sub Object::DESTROY {
332 eval { ... }
333 }
334
335 eval {
336 my $obj = Object->new;
337
338 die "foo";
339 };
340
341 if ( $@ ) {
342
343 }
344
1f7c5af6 345In this case since C<Object::DESTROY> is not localizing C<$@> but still uses
1d64c1ad 346C<eval>, it will set C<$@> to C<"">.
3176feef 347
1f7c5af6 348The destructor is called when the stack is unwound, after C<die> sets C<$@> to
3176feef 349C<"foo at Foo.pm line 42\n">, so by the time C<if ( $@ )> is evaluated it has
1f7c5af6 350been cleared by C<eval> in the destructor.
3176feef 351
1f7c5af6 352The workaround for this is even uglier than the previous ones. Even though we
353can't save the value of C<$@> from code that doesn't localize, we can at least
354be sure the eval was aborted due to an error:
3176feef 355
356 my $failed = not eval {
357 ...
358
359 return 1;
360 };
361
1f7c5af6 362This is because an C<eval> that caught a C<die> will always return a false
363value.
3176feef 364
f9b91e2c 365=head1 SHINY SYNTAX
3176feef 366
1f7c5af6 367Using Perl 5.10 you can use L<perlsyn/"Switch statements">.
3176feef 368
1f7c5af6 369The C<catch> block is invoked in a topicalizer context (like a C<given> block),
370but note that you can't return a useful value from C<catch> using the C<when>
27293e40 371blocks without an explicit C<return>.
3176feef 372
373This is somewhat similar to Perl 6's C<CATCH> blocks. You can use it to
374concisely match errors:
375
376 try {
377 require Foo;
378 } catch {
1f7c5af6 379 when (/^Can't locate .*?\.pm in \@INC/) { } # ignore
3176feef 380 default { die $_ }
deb85b37 381 };
3176feef 382
383=head1 CAVEATS
384
385=over 4
386
387=item *
388
318cb1eb 389C<@_> is not available, you need to name your args:
390
391 sub foo {
392 my ( $self, @args ) = @_;
393 try { $self->bar(@args) }
394 }
395
396=item *
397
398C<return> returns from the C<try> block, not from the parent sub (note that
399this is also how C<eval> works, but not how L<TryCatch> works):
400
401 sub bar {
402 try { return "foo" };
403 return "baz";
404 }
405
406 say bar(); # "baz"
407
408=item *
409
1f7c5af6 410C<try> introduces another caller stack frame. L<Sub::Uplevel> is not used. L<Carp>
411will report this when using full stack traces. This lack of magic is considered
412a feature.
3176feef 413
414=item *
415
57c50f41 416The value of C<$_> in the C<catch> block is not guaranteed to be the value of
417the exception thrown (C<$@>) in the C<try> block. There is no safe way to
418ensure this, since C<eval> may be used unhygenically in destructors. The only
419guarantee is that the C<catch> will be called if an exception is thrown.
3176feef 420
a5cd5f73 421=item *
422
423The return value of the C<catch> block is not ignored, so if testing the result
424of the expression for truth on success, be sure to return a false value from
425the C<catch> block:
426
427 my $obj = try {
428 MightFail->new;
429 } catch {
430 ...
431
432 return; # avoid returning a true value;
433 };
434
435 return unless $obj;
436
3176feef 437=back
438
439=head1 SEE ALSO
440
441=over 4
442
443=item L<TryCatch>
444
445Much more feature complete, more convenient semantics, but at the cost of
446implementation complexity.
447
9bc603cb 448=item L<autodie>
449
450Automatic error throwing for builtin functions and more. Also designed to
451work well with C<given>/C<when>.
452
f8227e43 453=item L<Throwable>
454
455A lightweight role for rolling your own exception classes.
456
3176feef 457=item L<Error>
458
459Exception object implementation with a C<try> statement. Does not localize
460C<$@>.
461
462=item L<Exception::Class::TryCatch>
463
464Provides a C<catch> statement, but properly calling C<eval> is your
465responsibility.
466
467The C<try> keyword pushes C<$@> onto an error stack, avoiding some of the
1d64c1ad 468issues with C<$@>, but you still need to localize to prevent clobbering.
3176feef 469
470=back
471
faecd5a0 472=head1 LIGHTNING TALK
473
474I gave a lightning talk about this module, you can see the slides (Firefox
475only):
476
477L<http://nothingmuch.woobling.org/talks/takahashi.xul?data=try_tiny.txt>
478
479Or read the source:
480
481L<http://nothingmuch.woobling.org/talks/yapc_asia_2009/try_tiny.yml>
482
3176feef 483=head1 VERSION CONTROL
484
485L<http://github.com/nothingmuch/try-tiny/>
486
487=head1 AUTHOR
488
489Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
490
491=head1 COPYRIGHT
492
c4e1eb12 493 Copyright (c) 2009 Yuval Kogman. All rights reserved.
3176feef 494 This program is free software; you can redistribute
c4e1eb12 495 it and/or modify it under the terms of the MIT license.
3176feef 496
497=cut
498