Line | |
---|
1 | module REXML
|
---|
2 | class ParseException < RuntimeError
|
---|
3 | attr_accessor :source, :parser, :continued_exception
|
---|
4 |
|
---|
5 | def initialize( message, source=nil, parser=nil, exception=nil )
|
---|
6 | super(message)
|
---|
7 | @source = source
|
---|
8 | @parser = parser
|
---|
9 | @continued_exception = exception
|
---|
10 | end
|
---|
11 |
|
---|
12 | def to_s
|
---|
13 | # Quote the original exception, if there was one
|
---|
14 | if @continued_exception
|
---|
15 | err = @continued_exception.inspect
|
---|
16 | err << "\n"
|
---|
17 | err << @continued_exception.backtrace.join("\n")
|
---|
18 | err << "\n...\n"
|
---|
19 | else
|
---|
20 | err = ""
|
---|
21 | end
|
---|
22 |
|
---|
23 | # Get the stack trace and error message
|
---|
24 | err << super
|
---|
25 |
|
---|
26 | # Add contextual information
|
---|
27 | if @source
|
---|
28 | err << "\nLine: #{line}\n"
|
---|
29 | err << "Position: #{position}\n"
|
---|
30 | err << "Last 80 unconsumed characters:\n"
|
---|
31 | err << @source.buffer[0..80].gsub(/\n/, ' ')
|
---|
32 | end
|
---|
33 |
|
---|
34 | err
|
---|
35 | end
|
---|
36 |
|
---|
37 | def position
|
---|
38 | @source.current_line[0] if @source and defined? @source.current_line and
|
---|
39 | @source.current_line
|
---|
40 | end
|
---|
41 |
|
---|
42 | def line
|
---|
43 | @source.current_line[2] if @source and defined? @source.current_line and
|
---|
44 | @source.current_line
|
---|
45 | end
|
---|
46 |
|
---|
47 | def context
|
---|
48 | @source.current_line
|
---|
49 | end
|
---|
50 | end
|
---|
51 | end
|
---|
Note:
See
TracBrowser
for help on using the repository browser.