Skip to content
Snippets Groups Projects
Commit a0c285a5 authored by Mark Winter's avatar Mark Winter
Browse files

Use RuntimeError base type for creating error format messages

parent fa3291b9
No related branches found
No related tags found
No related merge requests found
......@@ -27,7 +27,7 @@ namespace Script
using ArgConvertError = typename Script::Converter::ArgConvertError;
// General argument error exception
class ArgError: public std::runtime_error
class ArgError: public RuntimeError
{
static std::string make_convert_msg(const ArgConvertError& ace)
{
......@@ -36,10 +36,13 @@ namespace Script
public:
ArgError() = delete;
ArgError(const char* msg): std::runtime_error(msg)
template <typename... Args>
ArgError(const char* fmt, Args&&... args)
: RuntimeError(fmt, std::forward<Args>(args)...)
{}
ArgError(const ArgConvertError& ace): std::runtime_error(make_convert_msg(ace))
ArgError(const ArgConvertError& ace): ArgError(make_convert_msg(ace).c_str())
{}
};
......
......@@ -12,15 +12,6 @@
#include <algorithm>
#undef snprintf
#ifdef _WIN32
#define SNPRINTF std::snprintf
#else
#define SNPRINTF std::snprintf
#endif
#define BEGIN_TYPE_MAP(EnumType,ScriptEngine) \
typedef EnumType IdType; \
template <typename T> struct TypeToIdMap \
......@@ -47,36 +38,48 @@ namespace Script
std::vector<std::size_t> dims;
};
// Generic script conversion errors used by engine-specific converters
class ConvertErrors
// Helper class for creating format-string runtime errors
class RuntimeError: public std::runtime_error
{
public:
// Conversion exception types
class ArgConvertError: public std::runtime_error
template <typename... Args>
static std::unique_ptr<char[]> make_msg(const char* fmt, Args&&... args)
{
template <typename... Args>
static std::unique_ptr<char[]> make_msg(const char* fmt, Args... args)
{
size_t size = SNPRINTF(nullptr, 0, fmt, args...);
size_t size = std::snprintf(nullptr, 0, fmt, std::forward<Args>(args)...);
std::unique_ptr<char[]> msgPtr(new char[size+1]);
SNPRINTF(msgPtr.get(), size, fmt, args...);
return msgPtr;
}
std::unique_ptr<char[]> msgPtr(new char[size+1]);
std::snprintf(msgPtr.get(), size, fmt, std::forward<Args>(args)...);
return msgPtr;
}
static std::unique_ptr<char[]> make_msg(const char* fmt)
{
size_t size = std::strlen(fmt);
static std::unique_ptr<char[]> make_msg(const char* fmt)
{
size_t size = std::strlen(fmt);
std::unique_ptr<char[]> msgPtr(new char[size+1]);
std::strncpy(msgPtr.get(), fmt, size);
return msgPtr;
}
std::unique_ptr<char[]> msgPtr(new char[size+1]);
std::strncpy(msgPtr.get(), fmt, size);
return msgPtr;
}
public:
template <typename... Args>
RuntimeError(const char* fmt, Args&&... args)
: std::runtime_error(make_msg(fmt,std::forward<Args>(args)...).get())
{}
};
// Generic script conversion errors used by engine-specific converters
class ConvertErrors
{
public:
// Conversion exception types
class ArgConvertError: public RuntimeError
{
public:
template <typename... Args>
ArgConvertError(const char* argName, const char* fmt, Args... args)
: std::runtime_error(make_msg(fmt, args...).get()), argName(argName)
ArgConvertError(const char* argName, const char* fmt, Args&&... args)
: RuntimeError(fmt, std::forward<Args>(args)...), argName(argName)
{}
const char* getArgName() const { return argName; }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment