The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

use TryCatch;

BEGIN {
  try {
    require XML::SAX::Base;
    require XML::SAX::Expat;
  }
  catch ($e where { m{Can't locate XML/SAX/(?:Expat|Base)} } ) {
    plan skip_all => 'This test requires XML::SAX::Expat and XML::SAX::Base';
  }
}

# Use an explict plan since the problem was that it didn't behave and catch properly.
plan tests => 5;

my $parser = XML::SAX::Expat->new(
	Handler => MyHandler->new(),
);

$parser->parse_string(<<EOF);
<foo>
 <bar id="1">
 </bar>
 <bar id="2">
 </bar>
 <bar id="3">
 </bar>
 <bar id="4">
 </bar>
</foo>
EOF

print "Completed successfully\n";

package MyHandler;
use base qw(XML::SAX::Base);
use TryCatch;
use Test::More;

sub end_element {
	try {
		die "error message";
	} catch( $e where { $_ =~ /message/ } ){
		ok "caught message\n";
	}
}