Change props.cxx to throw std::exception

Throwing std::string is slightly unconventional, switch to throwing
exceptions inheriting std::exception.
This commit is contained in:
James Turner 2020-09-10 11:25:15 +01:00
parent b279384aef
commit 4560095c36
2 changed files with 21 additions and 22 deletions

View File

@ -6,9 +6,7 @@
//
// $Id$
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear_config.h>
#include "props.hxx"
@ -19,6 +17,8 @@
#include <sstream>
#include <iomanip>
#include <iterator>
#include <exception> // can't use sg_exception becuase of PROPS_STANDALONE
#include <stdio.h>
#include <string.h>
@ -137,7 +137,7 @@ parse_name (const SGPropertyNode *node, const Range &path)
i++;
}
if (i != max && *i != '/')
throw std::string("illegal character after . or ..");
throw std::runtime_error("illegal character after . or .. in '" + node->getPath() + "'");
} else if (isalpha_c(*i) || *i == '_') {
i++;
@ -153,7 +153,7 @@ parse_name (const SGPropertyNode *node, const Range &path)
err.push_back(*i);
err.append("' found in propertyname after '"+node->getPath()+"'");
err.append("\nname may contain only ._- and alphanumeric characters");
throw err;
throw std::runtime_error(err);
}
i++;
}
@ -165,7 +165,7 @@ parse_name (const SGPropertyNode *node, const Range &path)
err.push_back(*i);
err.append("' found in propertyname after '"+node->getPath()+"'");
err.append("\nname must begin with alpha or '_'");
throw err;
throw std::runtime_error(err);
}
}
return Range(path.begin(), i);
@ -215,7 +215,7 @@ parse_name (const string &path, int &i)
name = ".";
}
if (i < max && path[i] != '/')
throw string("Illegal character after " + name);
throw std::invalid_argument("Illegal character after " + name);
}
else if (isalpha(path[i]) || path[i] == '_') {
@ -231,7 +231,7 @@ parse_name (const string &path, int &i)
} else if (path[i] == '[' || path[i] == '/') {
break;
} else {
throw string("name may contain only ._- and alphanumeric characters");
throw std::invalid_argument("name may contain only ._- and alphanumeric characters");
}
i++;
}
@ -239,7 +239,7 @@ parse_name (const string &path, int &i)
else {
if (name.size() == 0)
throw string("name must begin with alpha or '_'");
throw std::invalid_argument("name must begin with alpha or '_'");
}
return name;
@ -272,7 +272,7 @@ parse_index (const string &path, int &i)
}
}
throw string("unterminated index (looking for ']')");
throw std::invalid_argument("unterminated index (looking for ']')");
}
/**
@ -467,7 +467,7 @@ find_node_aux(SGPropertyNode * current, SplitItr& itr, bool create,
if (equals(name, "..")) {
SGPropertyNode * parent = current->getParent();
if (parent == 0)
throw std::string("attempt to move past root with '..'");
throw std::runtime_error("attempt to move past root with '..'");
return find_node_aux(parent, ++itr, create, last_index);
}
int index = -1;
@ -500,10 +500,10 @@ find_node_aux(SGPropertyNode * current, SplitItr& itr, bool create,
}
}
if (i == token.end() || *i != ']')
throw std::string("unterminated index (looking for ']')");
throw std::runtime_error("unterminated index (looking for ']')");
} else {
throw std::string("illegal characters in token: ")
+ std::string(name.begin(), name.end());
throw std::runtime_error(string{"illegal characters in token: "}
+ std::string(name.begin(), name.end()));
}
}
}
@ -545,7 +545,7 @@ find_node (SGPropertyNode * current,
else if (components[position].name == "..") {
SGPropertyNode * parent = current->getParent();
if (parent == 0)
throw string("Attempt to move past root with '..'");
throw std::runtime_error("Attempt to move past root with '..'");
else
return find_node(parent, components, position + 1, create);
}
@ -950,7 +950,7 @@ SGPropertyNode::SGPropertyNode (Itr begin, Itr end,
_local_val.string_val = 0;
_value.val = 0;
if (!validateName(_name))
throw std::string("plain name expected instead of '") + _name + '\'';
throw std::invalid_argument(string{"plain name expected instead of '"} + _name + '\'');
}
SGPropertyNode::SGPropertyNode( const std::string& name,
@ -968,7 +968,7 @@ SGPropertyNode::SGPropertyNode( const std::string& name,
_local_val.string_val = 0;
_value.val = 0;
if (!validateName(name))
throw std::string("plain name expected instead of '") + _name + '\'';
throw std::invalid_argument(string{"plain name expected instead of '"} + _name + '\'');
}
/**

View File

@ -3,9 +3,7 @@
// Test harness.
////////////////////////////////////////////////////////////////////////
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear_config.h>
#include <simgear/compiler.h>
@ -13,6 +11,7 @@
#include <memory> // std::unique_ptr
#include <iostream>
#include <map>
#include <exception>
#include "props.hxx"
#include "props_io.hxx"
@ -968,8 +967,8 @@ int main (int ac, char ** av)
readProperties(SGPath::fromLocal8Bit(av[i]), &root);
writeProperties(cout, &root, true);
// cout << endl;
} catch (std::string &message) {
cout << "Aborted with " << message << endl;
} catch (std::exception &e) {
cout << "Aborted with " << e.what() << endl;
}
}