]> git.mxchange.org Git - simgear.git/commitdiff
Catch exceptions raised executing a command.
authorJames Turner <zakalawe@mac.com>
Mon, 9 Aug 2010 08:12:26 +0000 (09:12 +0100)
committerJames Turner <zakalawe@mac.com>
Mon, 9 Aug 2010 08:12:26 +0000 (09:12 +0100)
simgear/structure/SGBinding.hxx
simgear/structure/commands.cxx
simgear/structure/commands.hxx

index b15f7061641c1e3feb4efd48a606cfb8c0297710..25e1601efc4e970bace30afa993b9ebc0fdcd289 100644 (file)
@@ -58,7 +58,7 @@ public:
    *
    * @return The string name of the command for this binding.
    */
-  const string &getCommandName () const { return _command_name; }
+  const std::string &getCommandName () const { return _command_name; }
 
 
   /**
index b2391e3ba7f1cff7986f8eacf5364e985739ee56..6f6db1c661bad0544adb28150c0e946b22684a0c 100644 (file)
@@ -17,7 +17,8 @@
 #include "commands.hxx"
 
 #include <simgear/math/SGMath.hxx>
-
+#include <simgear/structure/exception.hxx>
+#include <simgear/debug/logstream.hxx>
 
 \f
 ////////////////////////////////////////////////////////////////////////
@@ -53,22 +54,22 @@ SGCommandMgr::instance()
 }
 
 void
-SGCommandMgr::addCommand (const string &name, command_t command)
+SGCommandMgr::addCommand (const std::string &name, command_t command)
 {
   _commands[name] = command;
 }
 
 SGCommandMgr::command_t
-SGCommandMgr::getCommand (const string &name) const
+SGCommandMgr::getCommand (const std::string &name) const
 {
   const command_map::const_iterator it = _commands.find(name);
   return (it != _commands.end() ? it->second : 0);
 }
 
-vector<string>
+string_list
 SGCommandMgr::getCommandNames () const
 {
-  vector<string> names;
+  string_list names;
   command_map::const_iterator it = _commands.begin();
   command_map::const_iterator last = _commands.end();
   while (it != last) {
@@ -79,13 +80,20 @@ SGCommandMgr::getCommandNames () const
 }
 
 bool
-SGCommandMgr::execute (const string &name, const SGPropertyNode * arg) const
+SGCommandMgr::execute (const std::string &name, const SGPropertyNode * arg) const
 {
   command_t command = getCommand(name);
   if (command == 0)
     return false;
-  else
+  
+  
+  try {
     return (*command)(arg);
+  } catch (sg_exception& e) {
+    SG_LOG(SG_GENERAL, SG_ALERT, "command '" << name << "' failed with exception\n"
+      << "\tmessage:" << e.getMessage() << " (from " << e.getOrigin() << ")");
+    return false;
+  }
 }
 
 // end of commands.cxx
index 0825ffd9fc58c3c97b966d3d498dd11892acd1a6..3f8a248fc7b76758c9ff08de1b4ff53a711e5d55 100644 (file)
 
 #include <OpenThreads/Mutex>
 
+#include <simgear/math/sg_types.hxx>
 #include <simgear/props/props.hxx>
 
-using std::string;
-using std::map;
-using std::vector;
-
-
 /**
  * Manage commands.
  *
@@ -65,7 +61,7 @@ public:
    * a bool result.  The argument is always a const pointer to
    * an SGPropertyNode (which may contain multiple values).
    */
-  virtual void addCommand (const string &name, command_t command);
+  virtual void addCommand (const std::string &name, command_t command);
 
 
   /**
@@ -75,7 +71,7 @@ public:
    * @return A pointer to the command, or 0 if there is no registered
    * command with the name specified.
    */
-  virtual command_t getCommand (const string &name) const;
+  virtual command_t getCommand (const std::string &name) const;
 
 
   /**
@@ -84,7 +80,7 @@ public:
    * @return A (possibly empty) vector of the names of all registered
    * commands.
    */
-  virtual vector<string> getCommandNames () const;
+  virtual string_list getCommandNames () const;
 
 
   /**
@@ -97,7 +93,7 @@ public:
    * @return true if the command is present and executes successfully,
    * false otherwise.
    */
-  virtual bool execute (const string &name, const SGPropertyNode * arg) const;
+  virtual bool execute (const std::string &name, const SGPropertyNode * arg) const;
 
 protected:
   /**
@@ -108,7 +104,7 @@ protected:
 
 private:
 
-  typedef map<string,command_t> command_map;
+  typedef std::map<std::string,command_t> command_map;
   command_map _commands;
 
   static OpenThreads::Mutex _instanceMutex;