%YAML 1.1 %TAG ! !VeryShiny:: --- !Talk - | SET-TIMER::5 OH HAI - my name - | [[PRE: NUFFIN ]] @nothingmuch Yuval Kogman - http://blog.woobling.org/ - iron man - please join - just blog - anyway - exceptions in Perl - throw - !Code die "foo" - !Code die $object - catch - !Code eval { } - !Code $@ - but - !Code eval - is - EVIL - why? - problem - !Code | eval { doesn::t_die(); }; - no error - | clobbers [[PRE: $@ ]] - !Code $@ = "" - !Code | sub DESTROY { eval { ... }; } - solution - !Code local $@; - problem - | [[PRE: local ]] breaks [[PRE: die ]] - "can't rethrow" - !Code | sub die { $@ = $_[0]; goto end_of_eval; } - !Code | { local $@; die "foo"; } - !Code | { local $@; $@ = "foo"; } - no more error - solution - !Code | my $error; { local $@; eval { ... }; $error = $@; } if ( ... ) { die $error; # rethrow } - problem - !Code if ( $@ ) - !Code DESTROY - !Code | eval { my $evil = ...; die "foo"; } if ( $@ ) { ... } - !Code | die "foo"; ... $evil->DESTROY(); ... if ( $@ ) { ... } - !Code | $@ = "foo"; ... eval { }; ... if ( $@ ) { ... } - !Code | $@ = "foo"; ... $@ = ""; ... if ( $@ ) { ... } - partial solution - !Code | my $ok = eval { ...; return 1; } - failure detected - | but no [[PRE: $@ ]] - oh well - "can't win em all" - combined solution - every time - instead of - !Code | my $value = eval { ... }; if ( $@ ) { warn $@; } else { return $value; } - !Code | local $@; my $value = eval { ... }; if ( $@ ) { warn $@; } else { return $value; } - !Code | my ( $error, $value ); { local $@; $value = eval { ... }; $error = $@; } if ( $error ) { warn $error; } else { return $value; } - !Code | my ( $error, $failed, $value ); { local $@; $failed = not eval { $value = ...; return 1; }; $error = $@; } if ( $failed ) { warn $error; } else { return $value; } - !Code | my ( $error, $failed, @ret ); my $wantarray = wantarray; { local $@; $failed = not eval { # note code duplication if ( $wantarray ) { @ret = ...; } elsif ( defined $wantarray ) { $ret[0] = ...; } else { ...; } return 1; }; $error = $@; } if ( $failed ) { warn $error; } else { return $wantarray ? @value : $ret[0]; } - every time - every f*%#ing time?! - yuck - solution for solution - !Code Try::Tiny - instead of - !Code | my $value = eval { ... }; if ( $@ ) { warn $@; } else { return $value; } - !Code | try { ... } catch { warn $_; }; - polite - defensive - minimal - 0 deps - 5.005_04 compatible - no catch sugar - but - !Code use 5.010; - !Code | try { require Foo; } catch { when ( /Can't locate Foo\.pm in \@INC/ ) { } default { die $_ } }; - like Perl 6 - bonus - !Code autodie - smartmatch friendly - want more syntax? - !Code TryCatch - MOAR AWESOME - !Code Devel::Declare - !Code MooseX::Method::Signatures - not minimal - "can't use everywhere" - | but [[PRE: Try::Tiny ]] can be - "don't be evil" - Thank you!