1package XML::SAX::Exception; 2 3use strict; 4 5use overload '""' => "stringify", 6 'fallback' => 1; 7 8use vars qw/$StackTrace $VERSION/; 9$VERSION = '1.01'; 10use Carp; 11 12$StackTrace = $ENV{XML_DEBUG} || 0; 13 14# Other exception classes: 15 16@XML::SAX::Exception::NotRecognized::ISA = ('XML::SAX::Exception'); 17@XML::SAX::Exception::NotSupported::ISA = ('XML::SAX::Exception'); 18@XML::SAX::Exception::Parse::ISA = ('XML::SAX::Exception'); 19 20 21sub throw { 22 my $class = shift; 23 if (ref($class)) { 24 die $class; 25 } 26 die $class->new(@_); 27} 28 29sub new { 30 my $class = shift; 31 my %opts = @_; 32 confess "Invalid options: " . join(', ', keys %opts) unless exists $opts{Message}; 33 34 bless { ($StackTrace ? (StackTrace => stacktrace()) : ()), %opts }, 35 $class; 36} 37 38sub stringify { 39 my $self = shift; 40 local $^W; 41 my $error; 42 if (exists $self->{LineNumber}) { 43 $error = $self->{Message} . " [Ln: " . $self->{LineNumber} . 44 ", Col: " . $self->{ColumnNumber} . "]"; 45 } 46 else { 47 $error = $self->{Message}; 48 } 49 if ($StackTrace) { 50 $error .= stackstring($self->{StackTrace}); 51 } 52 $error .= "\n"; 53 return $error; 54} 55 56sub stacktrace { 57 my $i = 2; 58 my @fulltrace; 59 while (my @trace = caller($i++)) { 60 my %hash; 61 @hash{qw(Package Filename Line)} = @trace[0..2]; 62 push @fulltrace, \%hash; 63 } 64 return \@fulltrace; 65} 66 67sub stackstring { 68 my $stacktrace = shift; 69 my $string = "\nFrom:\n"; 70 foreach my $current (@$stacktrace) { 71 $string .= $current->{Filename} . " Line: " . $current->{Line} . "\n"; 72 } 73 return $string; 74} 75 761; 77 78__END__ 79 80=head1 NAME 81 82XML::SAX::Exception - Exception classes for XML::SAX 83 84=head1 SYNOPSIS 85 86 throw XML::SAX::Exception::NotSupported( 87 Message => "The foo feature is not supported", 88 ); 89 90=head1 DESCRIPTION 91 92This module is the base class for all SAX Exceptions, those defined in 93the spec as well as those that one may create for one's own SAX errors. 94 95There are three subclasses included, corresponding to those of the SAX 96spec: 97 98 XML::SAX::Exception::NotSupported 99 XML::SAX::Exception::NotRecognized 100 XML::SAX::Exception::Parse 101 102Use them wherever you want, and as much as possible when you encounter 103such errors. SAX is meant to use exceptions as much as possible to 104flag problems. 105 106=head1 CREATING NEW EXCEPTION CLASSES 107 108All you need to do to create a new exception class is: 109 110 @XML::SAX::Exception::MyException::ISA = ('XML::SAX::Exception') 111 112The given package doesn't need to exist, it'll behave correctly this 113way. If your exception refines an existing exception class, then you 114may also inherit from that instead of from the base class. 115 116=head1 THROWING EXCEPTIONS 117 118This is as simple as exemplified in the SYNOPSIS. In fact, there's 119nothing more to know. All you have to do is: 120 121 throw XML::SAX::Exception::MyException( Message => 'Something went wrong' ); 122 123and voila, you've thrown an exception which can be caught in an eval block. 124 125=cut 126 127