diff --git a/lib/jsduck/app.rb b/lib/jsduck/app.rb index 6b8947de763a2d4798d7791f549d66a7803e3f25..52c853fbb09bcdcd53cb2a415fee729d08d8ef59 100644 --- a/lib/jsduck/app.rb +++ b/lib/jsduck/app.rb @@ -107,10 +107,7 @@ module JsDuck begin SourceFile.new(JsDuck::IO.read(fname), fname, @opts) rescue - puts "Error while parsing #{fname}: #{$!}" - puts - puts "Here's a full backtrace:" - puts $!.backtrace + Logger.instance.fatal("Error while parsing #{fname}", $!) exit(1) end end @@ -167,10 +164,15 @@ module JsDuck # Format all doc-objects in parallel formatted_classes = @parallel.map(@relations.classes) do |cls| Logger.instance.log("Markdown formatting #{cls[:name]}") - { - :doc => class_formatter.format(cls.internal_doc), - :images => doc_formatter.images - } + begin + { + :doc => class_formatter.format(cls.internal_doc), + :images => doc_formatter.images + } + rescue + Logger.instance.fatal("Error while formatting #{cls[:name]}", $!) + exit(1) + end end # Then merge the data back to classes sequentially formatted_classes.each do |cls| diff --git a/lib/jsduck/guides.rb b/lib/jsduck/guides.rb index d0f7cda8ac1b8fa47385c7237a8fcdbf40df2447..a5a4cc5df260385efcc3c00086fe71038a137279 100644 --- a/lib/jsduck/guides.rb +++ b/lib/jsduck/guides.rb @@ -59,16 +59,22 @@ module JsDuck def load_guide(guide) in_dir = @path + "/guides/" + guide["name"] - return Logger.instance.warn(:guide, "Guide #{in_dir} not found") unless File.exists?(in_dir) - guide_file = in_dir + "/README.md" - return Logger.instance.warn(:guide, "README.md not found in #{in_dir}") unless File.exists?(guide_file) + begin + return Logger.instance.warn(:guide, "Guide #{in_dir} not found") unless File.exists?(in_dir) - @formatter.doc_context = {:filename => guide_file, :linenr => 0} - name = File.basename(in_dir) - @formatter.img_path = "guides/#{name}" + guide_file = in_dir + "/README.md" + return Logger.instance.warn(:guide, "README.md not found in #{in_dir}") unless File.exists?(guide_file) - return add_toc(guide, @formatter.format(JsDuck::IO.read(guide_file))) + @formatter.doc_context = {:filename => guide_file, :linenr => 0} + name = File.basename(in_dir) + @formatter.img_path = "guides/#{name}" + + return add_toc(guide, @formatter.format(JsDuck::IO.read(guide_file))) + rescue + Logger.instance.fatal("Error while reading/formatting guide #{in_dir}", $!) + exit(1) + end end def write_guide(guide, dir) diff --git a/lib/jsduck/logger.rb b/lib/jsduck/logger.rb index 58b53ef038cd850746e9fdf1b4e4970146375aa6..2c736f6f072362ce13a0b6311c507812beddbb61 100644 --- a/lib/jsduck/logger.rb +++ b/lib/jsduck/logger.rb @@ -114,6 +114,15 @@ module JsDuck end out end + + # Prints fatal error message with backtrace. + # The error param should be $! from resque block. + def fatal(msg, error) + puts "#{msg}: #{error}" + puts + puts "Here's a full backtrace:" + puts error.backtrace + end end end