summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util/errors.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/util/errors.rb')
-rw-r--r--lib/puppet/util/errors.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/puppet/util/errors.rb b/lib/puppet/util/errors.rb
new file mode 100644
index 000000000..ad129ee34
--- /dev/null
+++ b/lib/puppet/util/errors.rb
@@ -0,0 +1,55 @@
+# Some helper methods for throwing errors.
+module Puppet::Util::Errors
+ # Throw a dev error.
+ def devfail(msg)
+ self.fail(Puppet::DevError, msg)
+ end
+
+ # Add line and file info if available and appropriate.
+ def adderrorcontext(error, other = nil)
+ error.line ||= self.line if self.respond_to?(:line) and self.line
+ error.file ||= self.file if self.respond_to?(:file) and self.file
+
+ if other and other.respond_to?(:backtrace)
+ error.set_backtrace other.backtrace
+ end
+
+ return error
+ end
+
+ # Wrap a call in such a way that we always throw the right exception and keep
+ # as much context as possible.
+ def exceptwrap(options = {})
+ options[:type] ||= Puppet::DevError
+ begin
+ retval = yield
+ rescue Puppet::Error => detail
+ raise adderrorcontext(detail)
+ rescue => detail
+ message = options[:message] || "%s failed with error %s: %s" %
+ [self.class, detail.class, detail.to_s]
+
+ error = options[:type].new(message)
+ # We can't use self.fail here because it always expects strings,
+ # not exceptions.
+ raise adderrorcontext(error, detail)
+ end
+
+ return retval
+ end
+
+ # Throw an error, defaulting to a Puppet::Error.
+ def fail(*args)
+ if args[0].is_a?(Class)
+ type = args.shift
+ else
+ type = Puppet::Error
+ end
+
+ error = adderrorcontext(type.new(args.join(" ")))
+
+ raise error
+ end
+end
+
+# $Id$