summaryrefslogtreecommitdiff
path: root/lib/error.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/error.rb')
-rw-r--r--lib/error.rb66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/error.rb b/lib/error.rb
new file mode 100644
index 0000000..39b3c76
--- /dev/null
+++ b/lib/error.rb
@@ -0,0 +1,66 @@
+module OpenToxError
+ attr_accessor :http_code, :message, :cause
+ def initialize message=nil
+ message = message.to_s.gsub(/\A"|"\Z/, '') if message # remove quotes
+ super message
+ @http_code ||= 500
+ @message = message.to_s
+ @cause = cut_backtrace(caller)
+ $logger.error("\n"+JSON.pretty_generate({
+ :http_code => @http_code,
+ :message => @message,
+ :cause => @cause
+ }))
+ end
+
+ def cut_backtrace(trace)
+ if trace.is_a?(Array)
+ cut_index = trace.find_index{|line| line.match(/sinatra|minitest/)}
+ cut_index ||= trace.size
+ cut_index -= 1
+ cut_index = trace.size-1 if cut_index < 0
+ trace[0..cut_index]
+ else
+ trace
+ end
+ end
+
+end
+
+class RuntimeError
+ include OpenToxError
+end
+
+# clutters log file with library errors
+#class NoMethodError
+ #include OpenToxError
+#end
+
+module OpenTox
+
+ class Error < RuntimeError
+ include OpenToxError
+
+ def initialize(code, message=nil)
+ @http_code = code
+ super message
+ end
+ end
+
+ # OpenTox errors
+ RestClientWrapper.known_errors.each do |error|
+ # create error classes
+ c = Class.new Error do
+ define_method :initialize do |message=nil|
+ super error[:code], message
+ end
+ end
+ OpenTox.const_set error[:class],c
+
+ # define global methods for raising errors, eg. bad_request_error
+ Object.send(:define_method, error[:method]) do |message|
+ raise c.new(message)
+ end
+ end
+
+end