Class: Nanoc::CLI::ErrorHandler Private
- Inherits:
-
Object
- Object
- Nanoc::CLI::ErrorHandler
- Defined in:
- lib/nanoc/cli/error_handler.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Catches errors and prints nice diagnostic messages, then exits.
Class Method Summary collapse
-
.disable ⇒ Object
private
Disables error handling.
-
.enable ⇒ Object
private
Re-enables error handling after it was disabled.
-
.handle_while(exit_on_error: true, &block) ⇒ void
private
Enables error handling in the given block.
-
.print_error(error) ⇒ void
private
Prints the given error to stderr.
Instance Method Summary collapse
- #handle_error(error, exit_on_error:) ⇒ Object private
-
#handle_while(exit_on_error:) ⇒ void
private
Enables error handling in the given block.
-
#print_error(error) ⇒ void
private
Prints the given error to stderr.
- #trivial?(error) ⇒ Boolean private
-
#write_compact_error(error, stream) ⇒ void
private
Writes a compact representation of the error, suitable for a terminal, on the given stream (probably stderr).
-
#write_verbose_error(error, stream) ⇒ void
private
Writes a verbose representation of the error on the given stream.
Class Method Details
.disable ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Disables error handling. This is used by the test cases to prevent error from being handled by the CLI while tests are running.
21 22 23 |
# File 'lib/nanoc/cli/error_handler.rb', line 21 def self.disable @disabled = true end |
.enable ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Re-enables error handling after it was disabled. This is used by the test cases to prevent error from being handled by the CLI while tests are running.
28 29 30 |
# File 'lib/nanoc/cli/error_handler.rb', line 28 def self.enable @disabled = false end |
.handle_while(exit_on_error: true, &block) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Enables error handling in the given block.
11 12 13 14 15 16 17 |
# File 'lib/nanoc/cli/error_handler.rb', line 11 def self.handle_while(exit_on_error: true, &block) if @disabled yield else new.handle_while(exit_on_error:, &block) end end |
.print_error(error) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Prints the given error to stderr. Includes message, possible resolution (see #resolution_for), compilation stack, backtrace, etc.
96 97 98 |
# File 'lib/nanoc/cli/error_handler.rb', line 96 def self.print_error(error) new.print_error(error) end |
Instance Method Details
#handle_error(error, exit_on_error:) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/nanoc/cli/error_handler.rb', line 75 def handle_error(error, exit_on_error:) if trivial?(error) $stderr.puts $stderr.puts "Error: #{error.}" resolution = resolution_for(error) if resolution $stderr.puts $stderr.puts resolution end else print_error(error) end exit(1) if exit_on_error end |
#handle_while(exit_on_error:) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Enables error handling in the given block. This method should not be called directly; use handle_while instead.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/nanoc/cli/error_handler.rb', line 36 def handle_while(exit_on_error:) # Set exit handler %w[INT TERM].each do |signal| Signal.trap(signal) do puts exit(0) end end # Set stack trace dump handler if !defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby' begin Signal.trap('USR1') do puts 'Caught USR1; dumping a stack trace' puts caller.map { |i| " #{i}" }.join("\n") end rescue ArgumentError end end # Run yield rescue Exception => e # rubocop:disable Lint/RescueException # The exception could be wrapped in a # Nanoc::Core::Errors::CompilationError, so find the # underlying exception and handle that one instead. e = unwrap_error(e) case e when Interrupt puts exit(1) when StandardError, ScriptError handle_error(e, exit_on_error:) else raise e end end |
#print_error(error) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Prints the given error to stderr. Includes message, possible resolution (see #resolution_for), compilation stack, backtrace, etc.
106 107 108 109 110 111 112 113 114 |
# File 'lib/nanoc/cli/error_handler.rb', line 106 def print_error(error) write_compact_error(error, $stderr) File.open('crash.log', 'w') do |io| cio = Nanoc::CLI.wrap_in_cleaning_stream(io) cio.add_stream_cleaner(::Nanoc::CLI::StreamCleaners::ANSIColors) write_verbose_error(error, cio) end end |
#trivial?(error) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
159 160 161 162 163 164 165 166 167 168 |
# File 'lib/nanoc/cli/error_handler.rb', line 159 def trivial?(error) case error when Nanoc::Core::TrivialError, Errno::EADDRINUSE true when LoadError GEM_NAMES.key?(gem_name_from_load_error(error)) else false end end |
#write_compact_error(error, stream) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Writes a compact representation of the error, suitable for a terminal, on the given stream (probably stderr).
124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/nanoc/cli/error_handler.rb', line 124 def write_compact_error(error, stream) stream.puts stream.puts 'Captain! We’ve been hit!' (stream, error) write_error_detail(stream, error) write_item_rep(stream, error) write_stack_trace(stream, error) stream.puts stream.puts 'A detailed crash log has been written to ./crash.log.' end |
#write_verbose_error(error, stream) ⇒ void
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Writes a verbose representation of the error on the given stream.
144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/nanoc/cli/error_handler.rb', line 144 def write_verbose_error(error, stream) stream.puts "Crash log created at #{Time.now}" (stream, error, verbose: true) write_error_detail(stream, error) write_item_rep(stream, error, verbose: true) write_stack_trace(stream, error, verbose: true) write_version_information(stream, verbose: true) write_system_information(stream, verbose: true) write_installed_gems(stream, verbose: true) write_gemfile_lock(stream, verbose: true) write_load_paths(stream, verbose: true) end |