#ifndef FIX_EXCEPTIONS_H
#define FIX_EXCEPTIONS_H
#include "Except.h"
#include "Utility.h"
#include <stdexcept>
#include <string>
namespace FIX {
struct Exception : public std::logic_error {
Exception(const std::string &type, const std::string &detail)
: std::logic_error(detail.size() ? type + ": " + detail : type),
type(type),
detail(detail) {}
~Exception() NOEXCEPT {}
std::string type;
std::string detail;
};
struct DataDictionaryNotFound : public Exception {
DataDictionaryNotFound(const std::string &version, const std::string &what = "")
: Exception("Could not find data dictionary", what),
version(version) {}
~DataDictionaryNotFound() NOEXCEPT {}
std::string version;
};
struct FieldNotFound : public Exception {
FieldNotFound(int field = 0, const std::string &what = "")
: Exception("Field not found: " + std::to_string(field), what),
field(field) {}
int field;
};
struct FieldConvertError : public Exception {
FieldConvertError(const std::string &what = "")
: Exception("Could not convert field", what) {}
};
struct MessageParseError : public Exception {
MessageParseError(const std::string &what = "")
: Exception("Could not parse message", what) {}
};
struct InvalidMessage : public Exception {
InvalidMessage(const std::string &what = "")
: Exception("Invalid message", what) {}
};
struct ConfigError : public Exception {
ConfigError(const std::string &what = "")
: Exception("Configuration failed", what) {}
};
struct RuntimeError : public Exception {
RuntimeError(const std::string &what = "")
: Exception("Runtime error", what) {}
};
struct InvalidTagNumber : public Exception {
InvalidTagNumber(int field = 0, const std::string &what = "")
: Exception("Invalid tag number: " + std::to_string(field), what),
field(field) {}
int field;
};
struct RequiredTagMissing : public Exception {
RequiredTagMissing(int field = 0, const std::string &what = "")
: Exception("Required tag missing: " + std::to_string(field), what),
field(field) {}
int field;
};
struct TagNotDefinedForMessage : public Exception {
TagNotDefinedForMessage(int field = 0, const std::string &what = "")
: Exception("Tag not defined for this message type: " + std::to_string(field), what),
field(field) {}
int field;
};
struct NoTagValue : public Exception {
NoTagValue(int field = 0, const std::string &what = "")
: Exception("Tag specified without a value: " + std::to_string(field), what),
field(field) {}
int field;
};
struct IncorrectTagValue : public Exception {
IncorrectTagValue(int field = 0, const std::string &what = "")
: Exception("Value is incorrect (out of range) for this tag: " + std::to_string(field), what),
field(field) {}
int field;
};
struct IncorrectDataFormat : public Exception {
IncorrectDataFormat(int field = 0, const std::string &what = "")
: Exception("Incorrect data format for value with tag: " + std::to_string(field), what),
field(field) {}
int field;
};
struct IncorrectMessageStructure : public Exception {
IncorrectMessageStructure(const std::string &what = "")
: Exception("Incorrect message structure", what) {}
};
struct DuplicateFieldNumber : public Exception {
DuplicateFieldNumber(const std::string &what = "")
: Exception("Duplicate field number", what) {}
};
struct InvalidMessageType : public Exception {
InvalidMessageType(const std::string &what = "")
: Exception("Invalid Message Type", what) {}
};
struct UnsupportedMessageType : public Exception {
UnsupportedMessageType(const std::string &what = "")
: Exception("Unsupported Message Type", what) {}
};
struct UnsupportedVersion : public Exception {
UnsupportedVersion(const std::string &what = "")
: Exception("Unsupported Version", what) {}
};
struct TagOutOfOrder : public Exception {
TagOutOfOrder(int field = 0, const std::string &what = "")
: Exception("Tag specified out of required order", what),
field(field) {}
int field;
};
struct RepeatedTag : public Exception {
RepeatedTag(int field = 0, const std::string &what = "")
: Exception("Repeated tag not part of repeating group", what),
field(field) {}
int field;
};
struct RepeatingGroupCountMismatch : public Exception {
RepeatingGroupCountMismatch(int field = 0, const std::string &what = "")
: Exception("Repeating group count mismatch", what),
field(field) {}
int field;
};
struct DoNotSend : public Exception {
DoNotSend(const std::string &what = "")
: Exception("Do Not Send Message", what) {}
};
struct RejectLogon : public Exception {
RejectLogon(const std::string &what = "")
: Exception("Rejected Logon Attempt", what) {}
};
struct SessionNotFound : public Exception {
SessionNotFound(const std::string &what = "")
: Exception("Session Not Found", what) {}
};
struct IOException : public Exception {
IOException(const std::string &what = "")
: Exception("IO Error", what) {}
};
struct SocketException : public Exception {
SocketException()
: Exception("Socket Error", errorToWhat()) {}
SocketException(const std::string &what)
: Exception("Socket Error", what) {}
static std::string errorToWhat() { return socket_error(); }
};
struct SocketSendFailed : public SocketException {
SocketSendFailed() {}
SocketSendFailed(const std::string &what)
: SocketException(what) {}
};
struct SocketRecvFailed : public SocketException {
SocketRecvFailed(ssize_t size)
: SocketException(
size == 0 ? "Connection reset by peer."
: size < 0 ? errorToWhat()
: "Success.") {}
SocketRecvFailed(const std::string &what)
: SocketException(what) {}
};
struct SocketCloseFailed : public SocketException {
SocketCloseFailed() {}
SocketCloseFailed(const std::string &what)
: SocketException(what) {}
};
}
#endif