Exception: Sass::SyntaxError
- Inherits:
-
StandardError
- Object
- StandardError
- Sass::SyntaxError
- Defined in:
- .ruby-sass/lib/sass/error.rb
Overview
An exception class that keeps track of the line of the Sass template it was raised on and the Sass file that was being parsed (if applicable).
All Sass errors are raised as SyntaxErrors.
When dealing with SyntaxErrors, it's important to provide filename and line number information. This will be used in various error reports to users, including backtraces; see #sass_backtrace for details.
Some of this information is usually provided as part of the constructor. New backtrace entries can be added with #add_backtrace, which is called when an exception is raised between files (e.g. with `@import`).
Often, a chunk of code will all have similar backtrace information - the same filename or even line. It may also be useful to have a default line number set. In those situations, the default values can be used by omitting the information on the original exception, and then calling #modify_backtrace in a wrapper `rescue`. When doing this, be sure that all exceptions ultimately end up with the information filled in.
Direct Known Subclasses
Direct Known Subclasses
Instance Attribute Summary (collapse)
-
#sass_backtrace ⇒ Aray<{Symbol => Object>}
The backtrace of the error within Sass files.
-
#sass_template ⇒ String
The text of the template where this error was raised.
Class Method Summary (collapse)
-
.exception_to_css(e, line_offset = 1) ⇒ String
Returns an error report for an exception in CSS format.
Instance Method Summary (collapse)
-
#add_backtrace(attrs) ⇒ Object
Adds an entry to the exception's Sass backtrace.
-
#backtrace ⇒ Array<String>
Returns the standard exception backtrace, including the Sass backtrace.
-
#initialize(msg, attrs = {}) ⇒ SyntaxError
constructor
A new instance of SyntaxError.
-
#modify_backtrace(attrs) ⇒ Object
Modify the top Sass backtrace entries (that is, the most deeply nested ones) to have the given attributes.
-
#sass_backtrace_str(default_filename = "an unknown file") ⇒ String
Returns a string representation of the Sass backtrace.
-
#sass_filename ⇒ String?
The name of the file in which the exception was raised.
-
#sass_line ⇒ Integer
The line of the Sass template on which the error occurred.
-
#sass_mixin ⇒ String
The name of the mixin in which the error occurred.
-
#to_s ⇒ String
The error message.
Constructor Details
#initialize(msg, attrs = {}) ⇒ SyntaxError
Returns a new instance of SyntaxError
55 56 57 58 59 |
# File '.ruby-sass/lib/sass/error.rb', line 55 def initialize(msg, attrs = {}) @message = msg @sass_backtrace = [] add_backtrace(attrs) end |
Constructor Details
#initialize(msg, attrs = {}) ⇒ SyntaxError
Returns a new instance of SyntaxError
55 56 57 58 59 |
# File '.ruby-sass/lib/sass/error.rb', line 55 def initialize(msg, attrs = {}) @message = msg @sass_backtrace = [] add_backtrace(attrs) end |
Instance Attribute Details
#sass_backtrace ⇒ Aray<{Symbol => Object>}
The backtrace of the error within Sass files. This is an array of hashes containing information for a single entry. The hashes have the following keys:
`:filename` : The name of the file in which the exception was raised,
or `nil` if no filename is available.
`:mixin` : The name of the mixin in which the exception was raised,
or `nil` if it wasn't raised in a mixin.
`:line` : The line of the file on which the error occurred. Never nil.
This information is also included in standard backtrace format in the output of #backtrace.
45 46 47 |
# File '.ruby-sass/lib/sass/error.rb', line 45 def sass_backtrace @sass_backtrace end |
#sass_template ⇒ String
The text of the template where this error was raised.
50 51 52 |
# File '.ruby-sass/lib/sass/error.rb', line 50 def sass_template @sass_template end |
Class Method Details
.exception_to_css(e, line_offset = 1) ⇒ String
Returns an error report for an exception in CSS format.
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
# File '.ruby-sass/lib/sass/error.rb', line 161 def exception_to_css(e, line_offset = 1) header = header_string(e, line_offset) <<END /* #{header.gsub('*/', '*\\/')} Backtrace:\n#{e.backtrace.join("\n").gsub('*/', '*\\/')} */ body:before { white-space: pre; font-family: monospace; content: "#{header.gsub('"', '\"').gsub("\n", '\\A ')}"; } END end |
Instance Method Details
#add_backtrace(attrs) ⇒ Object
Adds an entry to the exception's Sass backtrace.
88 89 90 |
# File '.ruby-sass/lib/sass/error.rb', line 88 def add_backtrace(attrs) sass_backtrace << attrs.reject {|_k, v| v.nil?} end |
#backtrace ⇒ Array<String>
Returns the standard exception backtrace, including the Sass backtrace.
126 127 128 129 130 131 132 133 |
# File '.ruby-sass/lib/sass/error.rb', line 126 def backtrace return nil if super.nil? return super if sass_backtrace.all? {|h| h.empty?} sass_backtrace.map do |h| "#{h[:filename] || '(sass)'}:#{h[:line]}" + (h[:mixin] ? ":in `#{h[:mixin]}'" : "") end + super end |
#modify_backtrace(attrs) ⇒ Object
Modify the top Sass backtrace entries (that is, the most deeply nested ones) to have the given attributes.
Specifically, this goes through the backtrace entries from most deeply nested to least, setting the given attributes for each entry. If an entry already has one of the given attributes set, the pre-existing attribute takes precedence and is not used for less deeply-nested entries (even if they don't have that attribute set).
106 107 108 109 110 111 112 113 114 115 |
# File '.ruby-sass/lib/sass/error.rb', line 106 def modify_backtrace(attrs) attrs = attrs.reject {|_k, v| v.nil?} # Move backwards through the backtrace (0...sass_backtrace.size).to_a.reverse_each do |i| entry = sass_backtrace[i] sass_backtrace[i] = attrs.merge(entry) attrs.reject! {|k, _v| entry.include?(k)} break if attrs.empty? end end |
#sass_backtrace_str(default_filename = "an unknown file") ⇒ String
Returns a string representation of the Sass backtrace.
140 141 142 143 144 145 146 147 148 149 150 |
# File '.ruby-sass/lib/sass/error.rb', line 140 def sass_backtrace_str(default_filename = "an unknown file") lines = .split("\n") msg = lines[0] + lines[1..-1]. map {|l| "\n" + (" " * "Error: ".size) + l}.join "Error: #{msg}" + sass_backtrace.each_with_index.map do |entry, i| "\n #{i == 0 ? 'on' : 'from'} line #{entry[:line]}" + " of #{entry[:filename] || default_filename}" + (entry[:mixin] ? ", in `#{entry[:mixin]}'" : "") end.join end |
#sass_filename ⇒ String?
The name of the file in which the exception was raised. This could be `nil` if no filename is available.
65 66 67 |
# File '.ruby-sass/lib/sass/error.rb', line 65 def sass_filename sass_backtrace.first[:filename] end |
#sass_line ⇒ Integer
The line of the Sass template on which the error occurred.
80 81 82 |
# File '.ruby-sass/lib/sass/error.rb', line 80 def sass_line sass_backtrace.first[:line] end |
#sass_mixin ⇒ String
The name of the mixin in which the error occurred. This could be `nil` if the error occurred outside a mixin.
73 74 75 |
# File '.ruby-sass/lib/sass/error.rb', line 73 def sass_mixin sass_backtrace.first[:mixin] end |
#to_s ⇒ String
Returns The error message
118 119 120 |
# File '.ruby-sass/lib/sass/error.rb', line 118 def to_s @message end |