This protects the user from seeing stack traces in normal situations.
It makes sense here because this is explicitly for user interactions.

Signed-off-by: Luke Kanies <[email protected]>
---
 lib/puppet/application.rb |   21 ++++++++++++++++-----
 spec/unit/application.rb  |   17 ++++++++++-------
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb
index e7240f7..2882c81 100644
--- a/lib/puppet/application.rb
+++ b/lib/puppet/application.rb
@@ -210,11 +210,11 @@ class Puppet::Application
 
     # This is the main application entry point
     def run
-        run_preinit
-        parse_options
-        Puppet.settings.parse if should_parse_config?
-        run_setup
-        run_command
+        exit_on_fail("initialize") { run_preinit }
+        exit_on_fail("parse options") { parse_options }
+        exit_on_fail("parse configuration file") { Puppet.settings.parse } if 
should_parse_config?
+        exit_on_fail("prepare for execution") { run_setup }
+        exit_on_fail("run") { run_command }
     end
 
     def main
@@ -299,4 +299,15 @@ class Puppet::Application
         end
     end
 
+    private
+
+    def exit_on_fail(message, code = 1)
+        begin
+            yield
+        rescue RuntimeError, NotImplementedError => detail
+            puts detail.backtrace if Puppet[:trace]
+            $stderr.puts "Could not %s: %s" % [message, detail]
+            exit(code)
+        end
+    end
 end
diff --git a/spec/unit/application.rb b/spec/unit/application.rb
index 5c3df09..c087373 100755
--- a/spec/unit/application.rb
+++ b/spec/unit/application.rb
@@ -261,22 +261,25 @@ describe Puppet::Application do
             @app.run
         end
 
-        it "should raise an error if no command can be called" do
-            lambda { @app.run }.should raise_error(NotImplementedError)
+        it "should warn and exit if no command can be called" do
+            $stderr.expects(:puts)
+            @app.expects(:exit).with(1)
+            @app.run
         end
 
         it "should raise an error if dispatch returns no command" do
             @app.stubs(:get_command).returns(nil)
-
-            lambda { @app.run }.should raise_error(NotImplementedError)
+            $stderr.expects(:puts)
+            @app.expects(:exit).with(1)
+            @app.run
         end
 
         it "should raise an error if dispatch returns an invalid command" do
             @app.stubs(:get_command).returns(:this_function_doesnt_exist)
-
-            lambda { @app.run }.should raise_error(NotImplementedError)
+            $stderr.expects(:puts)
+            @app.expects(:exit).with(1)
+            @app.run
         end
-
     end
 
     describe "when metaprogramming" do
-- 
1.6.1


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to