module Deltacloud::ExceptionHandler

Public Class Methods

exceptions(&block) click to toggle source
# File lib/deltacloud/drivers/exceptions.rb, line 174
def self.exceptions(&block)
  @definitions ||= []
  @definitions = Exceptions.new(&block).exception_definitions if block_given?
  @definitions
end
included(klass) click to toggle source
# File lib/deltacloud/drivers/exceptions.rb, line 193
def self.included(klass)
  klass.extend(DSL)
end
logger(logger=nil) click to toggle source
# File lib/deltacloud/drivers/exceptions.rb, line 188
def self.logger(logger=nil)
  @logger = logger
  @logger ||= ::Logger.new($stderr)
end

Public Instance Methods

safely(&block) click to toggle source
# File lib/deltacloud/drivers/exceptions.rb, line 197
def safely(&block)
  begin
    block.call
  rescue => e
    log = ExceptionHandler.logger
    self.class.exceptions.each do |definitions|
      next unless definitions.any? e
      if (new_exception = definitions.handler(e)) and new_exception.message
        message = new_exception.message
      end
      message ||= e.message
      log.error "#{[e.class.to_s, message].join(':')}\n#{e.backtrace[0..10].join("\n")}" unless ENV['RACK_ENV'] == 'test'
      raise definitions.handler(e) unless new_exception.nil?
    end
    log.error "[NO HANDLED] #{[e.class.to_s, e.message].join(': ')}\n#{e.backtrace.join("\n")}" unless ENV['RACK_ENV'] == 'test'
    raise BackendError.new(e, "Unhandled exception or status code (#{e.message})")
  end
end