Catch exceptions raised executing a command.

This commit is contained in:
James Turner
2010-08-09 09:12:26 +01:00
parent c4b4c0ce59
commit 0c55a4d7bb
3 changed files with 22 additions and 18 deletions
+1 -1
View File
@@ -58,7 +58,7 @@ public:
* *
* @return The string name of the command for this binding. * @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; }
/** /**
+15 -7
View File
@@ -17,7 +17,8 @@
#include "commands.hxx" #include "commands.hxx"
#include <simgear/math/SGMath.hxx> #include <simgear/math/SGMath.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/debug/logstream.hxx>
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@@ -53,22 +54,22 @@ SGCommandMgr::instance()
} }
void void
SGCommandMgr::addCommand (const string &name, command_t command) SGCommandMgr::addCommand (const std::string &name, command_t command)
{ {
_commands[name] = command; _commands[name] = command;
} }
SGCommandMgr::command_t 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); const command_map::const_iterator it = _commands.find(name);
return (it != _commands.end() ? it->second : 0); return (it != _commands.end() ? it->second : 0);
} }
vector<string> string_list
SGCommandMgr::getCommandNames () const SGCommandMgr::getCommandNames () const
{ {
vector<string> names; string_list names;
command_map::const_iterator it = _commands.begin(); command_map::const_iterator it = _commands.begin();
command_map::const_iterator last = _commands.end(); command_map::const_iterator last = _commands.end();
while (it != last) { while (it != last) {
@@ -79,13 +80,20 @@ SGCommandMgr::getCommandNames () const
} }
bool 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); command_t command = getCommand(name);
if (command == 0) if (command == 0)
return false; return false;
else
try {
return (*command)(arg); 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 // end of commands.cxx
+6 -10
View File
@@ -19,13 +19,9 @@
#include <OpenThreads/Mutex> #include <OpenThreads/Mutex>
#include <simgear/math/sg_types.hxx>
#include <simgear/props/props.hxx> #include <simgear/props/props.hxx>
using std::string;
using std::map;
using std::vector;
/** /**
* Manage commands. * Manage commands.
* *
@@ -65,7 +61,7 @@ public:
* a bool result. The argument is always a const pointer to * a bool result. The argument is always a const pointer to
* an SGPropertyNode (which may contain multiple values). * 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 * @return A pointer to the command, or 0 if there is no registered
* command with the name specified. * 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 * @return A (possibly empty) vector of the names of all registered
* commands. * 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, * @return true if the command is present and executes successfully,
* false otherwise. * false otherwise.
*/ */
virtual bool execute (const string &name, const SGPropertyNode * arg) const; virtual bool execute (const std::string &name, const SGPropertyNode * arg) const;
protected: protected:
/** /**
@@ -108,7 +104,7 @@ protected:
private: private:
typedef map<string,command_t> command_map; typedef std::map<std::string,command_t> command_map;
command_map _commands; command_map _commands;
static OpenThreads::Mutex _instanceMutex; static OpenThreads::Mutex _instanceMutex;