use Error qw( :try ); sub foo { warn "calling bar()\n"; bar(); } sub bar { throw Error::Simple("test error"); } sub evaltest { require Blah::Blah::Blah; Blah::Blah::Blah->new(); } sub run { warn "TEST 1\n"; try { warn "calling foo()\n"; foo(); warn "foo called()\n"; } catch Error::Simple with { my $E = shift; warn "Caught error: $E"; }; warn "TEST 2\n"; try { warn "calling evaltest()\n"; evaltest(); } catch Error::Simple with { warn "Caught error: $_[0]\n"; }; try { throw Error::Simple("except me"); } except { return { Error => sub { warn "whoa: $_[0]\n" }, 'Error::Simple' => sub { warn "wah: $_[0]" }, }; }; warn "\nTesting done\n"; } main->run();