#!/usr/bin/env perl { package Local::Exception; use overload '""' => \&__str__, 'eq' => \&__str_eq__; sub new { my $class = shift; my $obj = {}; bless $obj, $class; $obj->{error} = "Something bad!"; return $obj; } sub __str__ { my $self = shift; return $self->{error}; } sub __str_eq__ { my $self = shift; my $str = shift; return $self->{error} eq $str; } } { package Local::Obj; use feature "say"; sub new { my $class = shift; my $obj = {}; my %args = @_; bless $obj, $class; $obj->{raise} = defined $args{raise} ? $args{raise} : 1; $obj->{localize_glob_var} = defined $args{localize_glob_var} ? $args{localize_glob_var} : 0; return $obj; } sub something_risky { my $self = shift; die Local::Exception->new(); } sub DESTROY { my $self = shift; if ( $self->{raise} ) { if ( $self->{localize_glob_var} ) { my ( $err, $exc ); # Try clause { local $@; unless ( eval { die "Error"; return 1; } ) { $err = 1; $exc = $@; } } # Catch clause if ($err) { 1; } } else { my $ok = eval { die "Error!"; 1; }; if ( !$ok ) { 1; } } } } } use feature "say"; use Test::More tests => 2; sub test_1 { eval { my $obj = Local::Obj->new(); $obj->something_risky(); }; my $err = $@; isa_ok( $err, "Local::Exception" ); } sub test_2 { eval { my $obj = Local::Obj->new( localize_glob_var => 1 ); $obj->something_risky(); }; my $err = $@; isa_ok( $err, "Local::Exception" ); } test_1(); test_2();