use strict; use warnings; package SAME; use Carp; use Data::Dumper; sub out { $_[0] =~ m/^([-.*=]+ )/; my $nl = "\n" x ( length($1//0)/3); warn $nl, @_,"\n" } out "xxxxxxxxx Perl-Version $] $^OS"; #out '========= default $Carp::Verbose = ',$Carp::Verbose; my $err_msg = "error-message"; for my $verbose ( 0, 1, ) { if (defined $verbose) { $Carp::Verbose = $verbose; out "********* Setting Verbose to $verbose"; } no warnings 'redefine'; # --- types of dieing for my $type ( # "die", "croak", # "confess", ) { out "====== Testing <$type>"; for my $PACKAGE (qw/SAME OTHER THIRD/) { out "... from $PACKAGE package"; eval { $PACKAGE->client1($type) } or out $@; } } } sub throw0 { my ($pkg,$type) = @_; my $err_msg = $err_msg . "by <$type> from $pkg package"; eval { goto $type } or die "Testcase '$type' not implemented"; croak: croak $err_msg; die: die $err_msg; confess: confess $err_msg; } sub throw1 { throw0(@_) } sub throw2 { throw1(@_) } package OTHER; sub client0 { SAME::throw2(@_); }; sub client1 { client0(@_); }; package SAME; sub client0 { SAME::throw2(@_); }; sub client1 { client0(@_); }; package THIRD; sub client0 { OTHER::client0(@_); }; sub client1 { client0(@_); };