Merge utils/exceptions
into single file
Summary: Update documentation of `utils/exceptions.hpp` Reviewers: mislav.bradac, florijan, buda Reviewed By: buda Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D300
This commit is contained in:
parent
e5cc3f1561
commit
893df584f6
@ -6,6 +6,7 @@
|
|||||||
#include "communication/bolt/v1/state.hpp"
|
#include "communication/bolt/v1/state.hpp"
|
||||||
#include "logging/default.hpp"
|
#include "logging/default.hpp"
|
||||||
#include "query/exceptions.hpp"
|
#include "query/exceptions.hpp"
|
||||||
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace communication::bolt {
|
namespace communication::bolt {
|
||||||
|
|
||||||
@ -91,7 +92,7 @@ State StateExecutorRun(Session &session) {
|
|||||||
return State::Executor;
|
return State::Executor;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (const BasicException &e) {
|
} catch (const utils::BasicException &e) {
|
||||||
// clear header success message
|
// clear header success message
|
||||||
session.encoder_buffer_.Clear();
|
session.encoder_buffer_.Clear();
|
||||||
db_accessor->abort();
|
db_accessor->abort();
|
||||||
@ -104,7 +105,7 @@ State StateExecutorRun(Session &session) {
|
|||||||
}
|
}
|
||||||
return State::Error;
|
return State::Error;
|
||||||
|
|
||||||
} catch (const StacktraceException &e) {
|
} catch (const utils::StacktraceException &e) {
|
||||||
// clear header success message
|
// clear header success message
|
||||||
session.encoder_buffer_.Clear();
|
session.encoder_buffer_.Clear();
|
||||||
db_accessor->abort();
|
db_accessor->abort();
|
||||||
|
@ -8,7 +8,7 @@ namespace fs = std::experimental::filesystem;
|
|||||||
#include "logging/streams/stdout.hpp"
|
#include "logging/streams/stdout.hpp"
|
||||||
#include "query/preprocessor.hpp"
|
#include "query/preprocessor.hpp"
|
||||||
#include "utils/command_line/arguments.hpp"
|
#include "utils/command_line/arguments.hpp"
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/file.hpp"
|
#include "utils/file.hpp"
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ std::string ExtractQuery(const fs::path &path) {
|
|||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw BasicException("Unable to find query!");
|
throw utils::BasicException("Unable to find query!");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thrown when something (Edge or a Vertex) can not
|
* Thrown when something (Edge or a Vertex) can not
|
||||||
* be created. Typically due to database overload.
|
* be created. Typically due to database overload.
|
||||||
*/
|
*/
|
||||||
class CreationException : public StacktraceException {
|
class CreationException : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
@ -5,13 +5,14 @@
|
|||||||
|
|
||||||
#include "io/network/socket.hpp"
|
#include "io/network/socket.hpp"
|
||||||
#include "logging/default.hpp"
|
#include "logging/default.hpp"
|
||||||
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/likely.hpp"
|
#include "utils/likely.hpp"
|
||||||
|
|
||||||
namespace io::network {
|
namespace io::network {
|
||||||
|
|
||||||
class EpollError : StacktraceException {
|
class EpollError : utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace io::network {
|
namespace io::network {
|
||||||
|
|
||||||
class NetworkEndpointException : public BasicException {
|
class NetworkEndpointException : public utils::BasicException {
|
||||||
public:
|
public:
|
||||||
using BasicException::BasicException;
|
using utils::BasicException::BasicException;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdexcept>
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
|
||||||
|
|
||||||
namespace io::network {
|
namespace io::network {
|
||||||
|
|
||||||
class NetworkError : public StacktraceException {
|
class NetworkError : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "query/interpreter.hpp"
|
#include "query/interpreter.hpp"
|
||||||
#include "query/typed_value.hpp"
|
#include "query/typed_value.hpp"
|
||||||
#include "utils/algorithm.hpp"
|
#include "utils/algorithm.hpp"
|
||||||
#include "utils/exceptions/not_yet_implemented.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
#ifdef HAS_READLINE
|
#ifdef HAS_READLINE
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ void query::Repl(Dbms &dbms) {
|
|||||||
std::cout << "RUNTIME EXCEPTION: " << e.what() << std::endl;
|
std::cout << "RUNTIME EXCEPTION: " << e.what() << std::endl;
|
||||||
} catch (const query::TypedValueException &e) {
|
} catch (const query::TypedValueException &e) {
|
||||||
std::cout << "TYPED VALUE EXCEPTION: " << e.what() << std::endl;
|
std::cout << "TYPED VALUE EXCEPTION: " << e.what() << std::endl;
|
||||||
} catch (const NotYetImplemented &e) {
|
} catch (const utils::NotYetImplemented &e) {
|
||||||
std::cout << e.what() << std::endl;
|
std::cout << e.what() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ namespace fs = std::experimental::filesystem;
|
|||||||
template <typename Stream>
|
template <typename Stream>
|
||||||
class QueryEngine : public Loggable {
|
class QueryEngine : public Loggable {
|
||||||
private:
|
private:
|
||||||
using QueryPlanLib = DynamicLib<QueryPlanTrait<Stream>>;
|
using QueryPlanLib = utils::DynamicLib<QueryPlanTrait<Stream>>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QueryEngine() : Loggable("QueryEngine") {}
|
QueryEngine() : Loggable("QueryEngine") {}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
@ -9,8 +8,8 @@ namespace query {
|
|||||||
|
|
||||||
/** @brief Base class of all query language related exceptions.
|
/** @brief Base class of all query language related exceptions.
|
||||||
*/
|
*/
|
||||||
class QueryException : public BasicException {
|
class QueryException : public utils::BasicException {
|
||||||
using BasicException::BasicException;
|
using utils::BasicException::BasicException;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SyntaxException : public QueryException {
|
class SyntaxException : public QueryException {
|
||||||
@ -65,19 +64,19 @@ class QueryRuntimeException : public QueryException {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Move this elsewhere, it has no place in query.
|
// TODO: Move this elsewhere, it has no place in query.
|
||||||
class DecoderException : public StacktraceException {
|
class DecoderException : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PlanCompilationException : public StacktraceException {
|
class PlanCompilationException : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PlanExecutionException : public StacktraceException {
|
class PlanExecutionException : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace query
|
} // namespace query
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "query/exceptions.hpp"
|
#include "query/exceptions.hpp"
|
||||||
#include "query/interpret/awesome_memgraph_functions.hpp"
|
#include "query/interpret/awesome_memgraph_functions.hpp"
|
||||||
#include "utils/assert.hpp"
|
#include "utils/assert.hpp"
|
||||||
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace query {
|
namespace query {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
@ -117,7 +118,7 @@ antlrcpp::Any CypherMainVisitor::visitClause(CypherParser::ClauseContext *ctx) {
|
|||||||
return static_cast<Clause *>(ctx->with()->accept(this).as<With *>());
|
return static_cast<Clause *>(ctx->with()->accept(this).as<With *>());
|
||||||
}
|
}
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,7 +127,7 @@ antlrcpp::Any CypherMainVisitor::visitCypherMatch(
|
|||||||
auto *match = storage_.Create<Match>();
|
auto *match = storage_.Create<Match>();
|
||||||
if (ctx->OPTIONAL()) {
|
if (ctx->OPTIONAL()) {
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
if (ctx->where()) {
|
if (ctx->where()) {
|
||||||
match->where_ = ctx->where()->accept(this);
|
match->where_ = ctx->where()->accept(this);
|
||||||
@ -147,7 +148,7 @@ antlrcpp::Any CypherMainVisitor::visitCypherReturn(
|
|||||||
auto *return_clause = storage_.Create<Return>();
|
auto *return_clause = storage_.Create<Return>();
|
||||||
if (ctx->DISTINCT()) {
|
if (ctx->DISTINCT()) {
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
return_clause->body_.named_expressions =
|
return_clause->body_.named_expressions =
|
||||||
ctx->returnBody()->accept(this).as<std::vector<NamedExpression *>>();
|
ctx->returnBody()->accept(this).as<std::vector<NamedExpression *>>();
|
||||||
@ -158,7 +159,7 @@ antlrcpp::Any CypherMainVisitor::visitReturnBody(
|
|||||||
CypherParser::ReturnBodyContext *ctx) {
|
CypherParser::ReturnBodyContext *ctx) {
|
||||||
if (ctx->order() || ctx->skip() || ctx->limit()) {
|
if (ctx->order() || ctx->skip() || ctx->limit()) {
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
return ctx->returnItems()->accept(this);
|
return ctx->returnItems()->accept(this);
|
||||||
}
|
}
|
||||||
@ -167,7 +168,7 @@ antlrcpp::Any CypherMainVisitor::visitReturnItems(
|
|||||||
CypherParser::ReturnItemsContext *ctx) {
|
CypherParser::ReturnItemsContext *ctx) {
|
||||||
if (ctx->getTokens(kReturnAllTokenId).size()) {
|
if (ctx->getTokens(kReturnAllTokenId).size()) {
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
std::vector<NamedExpression *> named_expressions;
|
std::vector<NamedExpression *> named_expressions;
|
||||||
for (auto *item : ctx->returnItem()) {
|
for (auto *item : ctx->returnItem()) {
|
||||||
@ -230,7 +231,7 @@ antlrcpp::Any CypherMainVisitor::visitProperties(
|
|||||||
// better logical plan if we have an information about properties at
|
// better logical plan if we have an information about properties at
|
||||||
// compile time.
|
// compile time.
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
return ctx->mapLiteral()->accept(this);
|
return ctx->mapLiteral()->accept(this);
|
||||||
}
|
}
|
||||||
@ -257,7 +258,7 @@ antlrcpp::Any CypherMainVisitor::visitSymbolicName(
|
|||||||
// because we would have t ofigure out how escaping works since same
|
// because we would have t ofigure out how escaping works since same
|
||||||
// variable can be referenced in two ways: escaped and unescaped.
|
// variable can be referenced in two ways: escaped and unescaped.
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
// TODO: We should probably escape string.
|
// TODO: We should probably escape string.
|
||||||
return std::string(ctx->getText());
|
return std::string(ctx->getText());
|
||||||
@ -333,7 +334,7 @@ antlrcpp::Any CypherMainVisitor::visitRelationshipPattern(
|
|||||||
}
|
}
|
||||||
if (ctx->relationshipDetail()->rangeLiteral()) {
|
if (ctx->relationshipDetail()->rangeLiteral()) {
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// relationship.has_range = true;
|
// relationship.has_range = true;
|
||||||
@ -521,7 +522,7 @@ antlrcpp::Any CypherMainVisitor::visitExpression5(
|
|||||||
if (ctx->expression4().size() > 1u) {
|
if (ctx->expression4().size() > 1u) {
|
||||||
// TODO: implement power operator. In neo4j power is left associative and
|
// TODO: implement power operator. In neo4j power is left associative and
|
||||||
// int^int -> float.
|
// int^int -> float.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
@ -555,7 +556,7 @@ antlrcpp::Any CypherMainVisitor::visitExpression3(
|
|||||||
storage_.Create<IsNullOperator>(expression)));
|
storage_.Create<IsNullOperator>(expression)));
|
||||||
}
|
}
|
||||||
if (ctx->children.size() > 1U) {
|
if (ctx->children.size() > 1U) {
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
return static_cast<Expression *>(visitChildren(ctx));
|
return static_cast<Expression *>(visitChildren(ctx));
|
||||||
}
|
}
|
||||||
@ -565,7 +566,7 @@ antlrcpp::Any CypherMainVisitor::visitExpression2(
|
|||||||
if (ctx->nodeLabels().size()) {
|
if (ctx->nodeLabels().size()) {
|
||||||
// TODO: Implement this. We don't currently support label checking in
|
// TODO: Implement this. We don't currently support label checking in
|
||||||
// expresssion.
|
// expresssion.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
Expression *expression = ctx->atom()->accept(this);
|
Expression *expression = ctx->atom()->accept(this);
|
||||||
for (auto *lookup : ctx->propertyLookup()) {
|
for (auto *lookup : ctx->propertyLookup()) {
|
||||||
@ -581,7 +582,7 @@ antlrcpp::Any CypherMainVisitor::visitAtom(CypherParser::AtomContext *ctx) {
|
|||||||
return static_cast<Expression *>(visitChildren(ctx).as<Literal *>());
|
return static_cast<Expression *>(visitChildren(ctx).as<Literal *>());
|
||||||
} else if (ctx->parameter()) {
|
} else if (ctx->parameter()) {
|
||||||
// TODO: implement other clauses.
|
// TODO: implement other clauses.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
} else if (ctx->parenthesizedExpression()) {
|
} else if (ctx->parenthesizedExpression()) {
|
||||||
return static_cast<Expression *>(
|
return static_cast<Expression *>(
|
||||||
ctx->parenthesizedExpression()->accept(this));
|
ctx->parenthesizedExpression()->accept(this));
|
||||||
@ -594,7 +595,7 @@ antlrcpp::Any CypherMainVisitor::visitAtom(CypherParser::AtomContext *ctx) {
|
|||||||
}
|
}
|
||||||
// TODO: Implement this. We don't support comprehensions, functions,
|
// TODO: Implement this. We don't support comprehensions, functions,
|
||||||
// filtering... at the moment.
|
// filtering... at the moment.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
|
|
||||||
antlrcpp::Any CypherMainVisitor::visitLiteral(
|
antlrcpp::Any CypherMainVisitor::visitLiteral(
|
||||||
@ -612,7 +613,7 @@ antlrcpp::Any CypherMainVisitor::visitLiteral(
|
|||||||
ctx->numberLiteral()->accept(this).as<TypedValue>());
|
ctx->numberLiteral()->accept(this).as<TypedValue>());
|
||||||
} else {
|
} else {
|
||||||
// TODO: Implement map and list literals.
|
// TODO: Implement map and list literals.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
return visitChildren(ctx);
|
return visitChildren(ctx);
|
||||||
}
|
}
|
||||||
@ -639,7 +640,7 @@ antlrcpp::Any CypherMainVisitor::visitNumberLiteral(
|
|||||||
antlrcpp::Any CypherMainVisitor::visitFunctionInvocation(
|
antlrcpp::Any CypherMainVisitor::visitFunctionInvocation(
|
||||||
CypherParser::FunctionInvocationContext *ctx) {
|
CypherParser::FunctionInvocationContext *ctx) {
|
||||||
if (ctx->DISTINCT()) {
|
if (ctx->DISTINCT()) {
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
std::string function_name = ctx->functionName()->accept(this);
|
std::string function_name = ctx->functionName()->accept(this);
|
||||||
std::vector<Expression *> expressions;
|
std::vector<Expression *> expressions;
|
||||||
@ -908,7 +909,7 @@ antlrcpp::Any CypherMainVisitor::visitWith(CypherParser::WithContext *ctx) {
|
|||||||
auto *with = storage_.Create<With>();
|
auto *with = storage_.Create<With>();
|
||||||
if (ctx->DISTINCT()) {
|
if (ctx->DISTINCT()) {
|
||||||
// TODO: implement this
|
// TODO: implement this
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
with->body_.named_expressions =
|
with->body_.named_expressions =
|
||||||
ctx->returnBody()->accept(this).as<std::vector<NamedExpression *>>();
|
ctx->returnBody()->accept(this).as<std::vector<NamedExpression *>>();
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include "query/frontend/ast/ast.hpp"
|
#include "query/frontend/ast/ast.hpp"
|
||||||
#include "query/frontend/ast/named_antlr_tokens.hpp"
|
#include "query/frontend/ast/named_antlr_tokens.hpp"
|
||||||
#include "query/frontend/opencypher/generated/CypherBaseVisitor.h"
|
#include "query/frontend/opencypher/generated/CypherBaseVisitor.h"
|
||||||
#include "utils/exceptions/not_yet_implemented.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace query {
|
namespace query {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
@ -55,7 +55,7 @@ class CypherMainVisitor : public antlropencypher::CypherBaseVisitor {
|
|||||||
case kGeTokenId:
|
case kGeTokenId:
|
||||||
return storage_.Create<GreaterEqualOperator>(e1, e2);
|
return storage_.Create<GreaterEqualOperator>(e1, e2);
|
||||||
default:
|
default:
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ class CypherMainVisitor : public antlropencypher::CypherBaseVisitor {
|
|||||||
case kUnaryMinusTokenId:
|
case kUnaryMinusTokenId:
|
||||||
return storage_.Create<UnaryMinusOperator>(e);
|
return storage_.Create<UnaryMinusOperator>(e);
|
||||||
default:
|
default:
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "query/interpret/frame.hpp"
|
#include "query/interpret/frame.hpp"
|
||||||
#include "query/typed_value.hpp"
|
#include "query/typed_value.hpp"
|
||||||
#include "utils/assert.hpp"
|
#include "utils/assert.hpp"
|
||||||
#include "utils/exceptions/not_yet_implemented.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace query {
|
namespace query {
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ class ExpressionEvaluator : public TreeVisitorBase {
|
|||||||
}
|
}
|
||||||
case TypedValue::Type::Map:
|
case TypedValue::Type::Map:
|
||||||
// TODO implement me
|
// TODO implement me
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -917,7 +917,7 @@ void ReconstructTypedValue(TypedValue &value) {
|
|||||||
break;
|
break;
|
||||||
case TypedValue::Type::Path:
|
case TypedValue::Type::Path:
|
||||||
// TODO implement path reconstruct?
|
// TODO implement path reconstruct?
|
||||||
throw NotYetImplemented("Path reconstruction not yet supported");
|
throw utils::NotYetImplemented("Path reconstruction not yet supported");
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include <query/exceptions.hpp>
|
#include <query/exceptions.hpp>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <utils/exceptions/not_yet_implemented.hpp>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "database/graph_db_accessor.hpp"
|
#include "database/graph_db_accessor.hpp"
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
#include "query/frontend/ast/ast.hpp"
|
#include "query/frontend/ast/ast.hpp"
|
||||||
#include "utils/exceptions/not_yet_implemented.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace query {
|
namespace query {
|
||||||
namespace plan {
|
namespace plan {
|
||||||
@ -309,7 +309,7 @@ auto GenWith(With &with, LogicalOperator *input_op,
|
|||||||
// optional Filter.
|
// optional Filter.
|
||||||
if (with.body_.distinct) {
|
if (with.body_.distinct) {
|
||||||
// TODO: Plan distinct with, when operator available.
|
// TODO: Plan distinct with, when operator available.
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
// In case of update and aggregation, we want to accumulate first, so that
|
// In case of update and aggregation, we want to accumulate first, so that
|
||||||
// when aggregating, we get the latest results. Similar to RETURN clause.
|
// when aggregating, we get the latest results. Similar to RETURN clause.
|
||||||
@ -407,7 +407,7 @@ std::unique_ptr<LogicalOperator> MakeLogicalPlan(
|
|||||||
is_write = true;
|
is_write = true;
|
||||||
input_op = op;
|
input_op = op;
|
||||||
} else {
|
} else {
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return std::unique_ptr<LogicalOperator>(input_op);
|
return std::unique_ptr<LogicalOperator>(input_op);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "utils/assert.hpp"
|
#include "utils/assert.hpp"
|
||||||
#include "utils/exceptions/not_yet_implemented.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/hashing/fnv.hpp"
|
#include "utils/hashing/fnv.hpp"
|
||||||
|
|
||||||
namespace query {
|
namespace query {
|
||||||
@ -505,7 +505,7 @@ TypedValue operator==(const TypedValue &a, const TypedValue &b) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case TypedValue::Type::Path:
|
case TypedValue::Type::Path:
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
default:
|
default:
|
||||||
permanent_fail("Unhandled comparison for types");
|
permanent_fail("Unhandled comparison for types");
|
||||||
}
|
}
|
||||||
@ -784,7 +784,7 @@ size_t TypedValue::Hash::operator()(const TypedValue &value) const {
|
|||||||
case TypedValue::Type::Edge:
|
case TypedValue::Type::Edge:
|
||||||
return value.Value<EdgeAccessor>().temporary_id();
|
return value.Value<EdgeAccessor>().temporary_id();
|
||||||
case TypedValue::Type::Path:
|
case TypedValue::Type::Path:
|
||||||
throw NotYetImplemented();
|
throw utils::NotYetImplemented();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
permanent_fail("Unhandled TypedValue.type() in hash function");
|
permanent_fail("Unhandled TypedValue.type() in hash function");
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "storage/property_value.hpp"
|
#include "storage/property_value.hpp"
|
||||||
#include "storage/vertex_accessor.hpp"
|
#include "storage/vertex_accessor.hpp"
|
||||||
#include "traversal/path.hpp"
|
#include "traversal/path.hpp"
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/total_ordering.hpp"
|
#include "utils/total_ordering.hpp"
|
||||||
|
|
||||||
namespace query {
|
namespace query {
|
||||||
@ -171,9 +171,9 @@ class TypedValue : public TotalOrdering<TypedValue, TypedValue, TypedValue> {
|
|||||||
* trying to perform operations (such as addition) on TypedValues
|
* trying to perform operations (such as addition) on TypedValues
|
||||||
* of incompatible Types.
|
* of incompatible Types.
|
||||||
*/
|
*/
|
||||||
class TypedValueException : public BasicException {
|
class TypedValueException : public utils::BasicException {
|
||||||
public:
|
public:
|
||||||
using ::BasicException::BasicException;
|
using utils::BasicException::BasicException;
|
||||||
};
|
};
|
||||||
|
|
||||||
// comparison operators
|
// comparison operators
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/total_ordering.hpp"
|
#include "utils/total_ordering.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -90,9 +90,9 @@ class PropertyValue {
|
|||||||
* trying to perform operations (such as addition) on PropertyValues
|
* trying to perform operations (such as addition) on PropertyValues
|
||||||
* of incompatible Types.
|
* of incompatible Types.
|
||||||
*/
|
*/
|
||||||
class PropertyValueException : public StacktraceException {
|
class PropertyValueException : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using ::StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
|
||||||
// stream output
|
// stream output
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
class LockTimeoutException : public BasicException {
|
class LockTimeoutException : public utils::BasicException {
|
||||||
public:
|
public:
|
||||||
using BasicException::BasicException;
|
using utils::BasicException::BasicException;
|
||||||
};
|
};
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/option.hpp"
|
#include "utils/option.hpp"
|
||||||
|
|
||||||
#define REGISTER_ARGS(argc, argv) \
|
#define REGISTER_ARGS(argc, argv) \
|
||||||
@ -29,10 +29,10 @@ namespace {
|
|||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wunused-function"
|
#pragma clang diagnostic ignored "-Wunused-function"
|
||||||
|
|
||||||
class ProgramArgumentException : public StacktraceException {
|
class ProgramArgumentException : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
ProgramArgumentException(const std::string &mess)
|
ProgramArgumentException(const std::string &mess)
|
||||||
: StacktraceException("ProgramArgumentException: " + mess + ".") {}
|
: utils::StacktraceException("ProgramArgumentException: " + mess + ".") {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ProgramArguments {
|
class ProgramArguments {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
#include "utils/datetime/datetime_error.hpp"
|
||||||
|
|
||||||
class Datetime {
|
class Datetime {
|
||||||
public:
|
public:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
class DatetimeError : public StacktraceException {
|
class DatetimeError : public utils::StacktraceException {
|
||||||
public:
|
public:
|
||||||
using StacktraceException::StacktraceException;
|
using utils::StacktraceException::StacktraceException;
|
||||||
};
|
};
|
||||||
|
@ -4,11 +4,21 @@
|
|||||||
#include <experimental/filesystem>
|
#include <experimental/filesystem>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "utils/exceptions/dynamic_lib_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
namespace fs = std::experimental::filesystem;
|
namespace fs = std::experimental::filesystem;
|
||||||
|
|
||||||
#include "logging/loggable.hpp"
|
#include "logging/loggable.hpp"
|
||||||
|
|
||||||
|
namespace utils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Exception raised by @c DynamicLib.
|
||||||
|
*/
|
||||||
|
class DynamicLibException : public utils::BasicException {
|
||||||
|
public:
|
||||||
|
using utils::BasicException::BasicException;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DynamicLib is a wrapper aroung dynamic object returned by dlopen.
|
* DynamicLib is a wrapper aroung dynamic object returned by dlopen.
|
||||||
*
|
*
|
||||||
@ -116,3 +126,5 @@ class DynamicLib : public Loggable {
|
|||||||
typename T::ProducePrototype produce_method;
|
typename T::ProducePrototype produce_method;
|
||||||
typename T::DestructPrototype destruct_method;
|
typename T::DestructPrototype destruct_method;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace utils
|
||||||
|
195
src/utils/exceptions.hpp
Normal file
195
src/utils/exceptions.hpp
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief This file stores the common exceptions used across the project.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <fmt/ostream.h>
|
||||||
|
|
||||||
|
#include "utils/stacktrace/stacktrace.hpp"
|
||||||
|
|
||||||
|
namespace utils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Base class for all regular exceptions.
|
||||||
|
*
|
||||||
|
* All custom exceptions should inherit from this class. It stores the message
|
||||||
|
* with which it was constructed. To retrieve the message, use
|
||||||
|
* @c BasicException::what method. In case you need to store a stack trace, you
|
||||||
|
* should use @c StacktraceException
|
||||||
|
*
|
||||||
|
* @sa StacktraceException
|
||||||
|
* @sa NotYetImplemented
|
||||||
|
*/
|
||||||
|
class BasicException : public std::exception {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor (C strings).
|
||||||
|
*
|
||||||
|
* @param message C-style string error message.
|
||||||
|
* The string contents are copied upon construction.
|
||||||
|
* Hence, responsibility for deleting the `char*` lies
|
||||||
|
* with the caller.
|
||||||
|
*/
|
||||||
|
explicit BasicException(const char *message) noexcept : msg_(message) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor (C++ STL strings).
|
||||||
|
*
|
||||||
|
* @param message The error message.
|
||||||
|
*/
|
||||||
|
explicit BasicException(const std::string &message) noexcept : msg_(message) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor with format string (C++ STL strings).
|
||||||
|
*
|
||||||
|
* @param format The error format message.
|
||||||
|
* @param args Arguments for format string.
|
||||||
|
*/
|
||||||
|
template <class... Args>
|
||||||
|
explicit BasicException(const std::string &format, Args &&... args) noexcept
|
||||||
|
: BasicException(fmt::format(format, std::forward<Args>(args)...)) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor with format string (C strings).
|
||||||
|
*
|
||||||
|
* @param format The error format message. The string contents are copied upon
|
||||||
|
* construction. Hence, the responsibility for deleting `char*` lies with the
|
||||||
|
* caller.
|
||||||
|
* @param args Arguments for format string.
|
||||||
|
*/
|
||||||
|
template <class... Args>
|
||||||
|
explicit BasicException(const char *format, Args &&... args) noexcept
|
||||||
|
: BasicException(fmt::format(std::string(format),
|
||||||
|
std::forward<Args>(args)...)) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Virtual destructor to allow for subclassing.
|
||||||
|
*/
|
||||||
|
virtual ~BasicException() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a pointer to the (constant) error description.
|
||||||
|
*
|
||||||
|
* @return A pointer to a `const char*`. The underlying memory
|
||||||
|
* is in possession of the @c BasicException object. Callers must
|
||||||
|
* not attempt to free the memory.
|
||||||
|
*/
|
||||||
|
const char *what() const noexcept override { return msg_.c_str(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief Error message.
|
||||||
|
*/
|
||||||
|
std::string msg_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Base class for all exceptions which need to store the stack trace.
|
||||||
|
*
|
||||||
|
* When you need to store the stack trace from the place this exception is
|
||||||
|
* created, you should use this class. The error message can be obtained using
|
||||||
|
* @c StacktraceException::what method, while the stack trace itself can be
|
||||||
|
* obtained via @c StacktraceException::trace method. If the stack trace is not
|
||||||
|
* needed, you should use @c BasicException.
|
||||||
|
*
|
||||||
|
* @sa BasicException
|
||||||
|
* @sa NotYetImplemented
|
||||||
|
*/
|
||||||
|
class StacktraceException : public std::exception {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor (C strings).
|
||||||
|
*
|
||||||
|
* @param message C-style string error message.
|
||||||
|
* The string contents are copied upon construction.
|
||||||
|
* Hence, responsibility for deleting the `char*` lies
|
||||||
|
* with the caller.
|
||||||
|
*/
|
||||||
|
explicit StacktraceException(const char *message) noexcept
|
||||||
|
: message_(message) {
|
||||||
|
Stacktrace stacktrace;
|
||||||
|
stacktrace_ = stacktrace.dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor (C++ STL strings).
|
||||||
|
*
|
||||||
|
* @param message The error message.
|
||||||
|
*/
|
||||||
|
explicit StacktraceException(const std::string &message) noexcept
|
||||||
|
: message_(message) {
|
||||||
|
Stacktrace stacktrace;
|
||||||
|
stacktrace_ = stacktrace.dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor with format string (C++ STL strings).
|
||||||
|
*
|
||||||
|
* @param format The error format message.
|
||||||
|
* @param args Arguments for format string.
|
||||||
|
*/
|
||||||
|
template <class... Args>
|
||||||
|
explicit StacktraceException(const std::string &format,
|
||||||
|
Args &&... args) noexcept
|
||||||
|
: StacktraceException(fmt::format(format, std::forward<Args>(args)...)) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor with format string (C strings).
|
||||||
|
*
|
||||||
|
* @param format The error format message. The string contents are copied upon
|
||||||
|
* construction. Hence, the responsibility for deleting `char*` lies with the
|
||||||
|
* caller.
|
||||||
|
* @param args Arguments for format string.
|
||||||
|
*/
|
||||||
|
template <class... Args>
|
||||||
|
explicit StacktraceException(const char *format, Args &&... args) noexcept
|
||||||
|
: StacktraceException(fmt::format(std::string(format),
|
||||||
|
std::forward<Args>(args)...)) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Virtual destructor to allow for subclassing.
|
||||||
|
*/
|
||||||
|
virtual ~StacktraceException() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a pointer to the (constant) error description.
|
||||||
|
*
|
||||||
|
* @return A pointer to a `const char*`. The underlying memory
|
||||||
|
* is in possession of the @c StacktraceException object. Callers must
|
||||||
|
* not attempt to free the memory.
|
||||||
|
*/
|
||||||
|
const char *what() const noexcept override { return message_.c_str(); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns a pointer to the (constant) stack trace message.
|
||||||
|
*
|
||||||
|
* @return A pointer to a `const char*`. The underlying memory
|
||||||
|
* is in possession of the @c StacktraceException object. Callers must
|
||||||
|
* not attempt to free the memory.
|
||||||
|
*/
|
||||||
|
const char *trace() const noexcept { return stacktrace_.c_str(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string message_;
|
||||||
|
std::string stacktrace_;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Raise this exception for functionality which is yet to be implemented.
|
||||||
|
*/
|
||||||
|
class NotYetImplemented final : public StacktraceException {
|
||||||
|
public:
|
||||||
|
using StacktraceException::StacktraceException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Construct with the default "Not yet implemented!" message.
|
||||||
|
*/
|
||||||
|
NotYetImplemented() noexcept : StacktraceException("Not yet implemented!") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace utils
|
@ -1,72 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by buda on 18/02/17.
|
|
||||||
//
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief BasicException
|
|
||||||
*
|
|
||||||
* Just a wrapper around std::exception.
|
|
||||||
*/
|
|
||||||
class BasicException : public std::exception {
|
|
||||||
public:
|
|
||||||
/** Constructor (C strings).
|
|
||||||
*
|
|
||||||
* @param message C-style string error message.
|
|
||||||
* The string contents are copied upon construction.
|
|
||||||
* Hence, responsibility for deleting the char* lies
|
|
||||||
* with the caller.
|
|
||||||
*/
|
|
||||||
explicit BasicException(const char *message) : msg_(message) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor (C++ STL strings).
|
|
||||||
*
|
|
||||||
* @param message The error message.
|
|
||||||
*/
|
|
||||||
explicit BasicException(const std::string &message) : msg_(message) {}
|
|
||||||
|
|
||||||
/** Constructor with format string (C++ STL strings).
|
|
||||||
*
|
|
||||||
* @param format The error format message.
|
|
||||||
* @param args Arguments for format string.
|
|
||||||
*/
|
|
||||||
template <class... Args>
|
|
||||||
explicit BasicException(const std::string &format, Args &&... args) noexcept
|
|
||||||
: BasicException(fmt::format(format, std::forward<Args>(args)...)) {}
|
|
||||||
|
|
||||||
/** Constructor with format string (C strings).
|
|
||||||
*
|
|
||||||
* @param format The error format message. The string contents are copied upon
|
|
||||||
* construction. Hence, the responsibility for deleting char* lies with the
|
|
||||||
* caller.
|
|
||||||
* @param args Arguments for format string.
|
|
||||||
*/
|
|
||||||
template <class... Args>
|
|
||||||
explicit BasicException(const char *format, Args &&... args) noexcept
|
|
||||||
: BasicException(fmt::format(std::string(format),
|
|
||||||
std::forward<Args>(args)...)) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor. Virtual to allow for subclassing.
|
|
||||||
*/
|
|
||||||
virtual ~BasicException() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a pointer to the (constant) error description.
|
|
||||||
*
|
|
||||||
* @return A pointer to a const char*. The underlying memory
|
|
||||||
* is in possession of the BasicException object. Callers must
|
|
||||||
* not attempt to free the memory.
|
|
||||||
*/
|
|
||||||
const char *what() const noexcept override { return msg_.c_str(); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* Error message.
|
|
||||||
*/
|
|
||||||
std::string msg_;
|
|
||||||
};
|
|
@ -1,9 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
|
||||||
|
|
||||||
class DynamicLibException : public BasicException {
|
|
||||||
public:
|
|
||||||
using BasicException::BasicException;
|
|
||||||
};
|
|
@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
|
||||||
|
|
||||||
class NonExhaustiveSwitch : public StacktraceException {
|
|
||||||
public:
|
|
||||||
using StacktraceException::StacktraceException;
|
|
||||||
};
|
|
@ -1,10 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
|
||||||
|
|
||||||
class NotYetImplemented : public StacktraceException {
|
|
||||||
public:
|
|
||||||
using StacktraceException::StacktraceException;
|
|
||||||
|
|
||||||
NotYetImplemented() : StacktraceException("Not yet implemented!") {}
|
|
||||||
};
|
|
@ -1,8 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
|
||||||
|
|
||||||
class OutOfMemory : public StacktraceException {
|
|
||||||
public:
|
|
||||||
using StacktraceException::StacktraceException;
|
|
||||||
};
|
|
@ -1,33 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <fmt/ostream.h>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
#include "utils/auto_scope.hpp"
|
|
||||||
#include "utils/stacktrace/stacktrace.hpp"
|
|
||||||
|
|
||||||
class StacktraceException : public std::exception {
|
|
||||||
public:
|
|
||||||
StacktraceException(const std::string &message) noexcept : message_(message) {
|
|
||||||
Stacktrace stacktrace;
|
|
||||||
stacktrace_ = stacktrace.dump();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class... Args>
|
|
||||||
StacktraceException(const std::string &format, Args &&... args) noexcept
|
|
||||||
: StacktraceException(fmt::format(format, std::forward<Args>(args)...)) {}
|
|
||||||
|
|
||||||
template <class... Args>
|
|
||||||
StacktraceException(const char *format, Args &&... args) noexcept
|
|
||||||
: StacktraceException(fmt::format(std::string(format),
|
|
||||||
std::forward<Args>(args)...)) {}
|
|
||||||
|
|
||||||
const char *what() const noexcept override { return message_.c_str(); }
|
|
||||||
|
|
||||||
const char *trace() const noexcept { return stacktrace_.c_str(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string message_;
|
|
||||||
std::string stacktrace_;
|
|
||||||
};
|
|
@ -24,7 +24,7 @@ namespace fs = std::experimental::filesystem;
|
|||||||
#include "logging/loggable.hpp"
|
#include "logging/loggable.hpp"
|
||||||
#include "utils/algorithm.hpp"
|
#include "utils/algorithm.hpp"
|
||||||
#include "utils/assert.hpp"
|
#include "utils/assert.hpp"
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/likely.hpp"
|
#include "utils/likely.hpp"
|
||||||
#include "utils/underlying_cast.hpp"
|
#include "utils/underlying_cast.hpp"
|
||||||
|
|
||||||
|
@ -2,12 +2,22 @@
|
|||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include "utils/exceptions/out_of_memory.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/likely.hpp"
|
#include "utils/likely.hpp"
|
||||||
#include "utils/memory/block_allocator.hpp"
|
#include "utils/memory/block_allocator.hpp"
|
||||||
|
|
||||||
// http://en.cppreference.com/w/cpp/language/new
|
// http://en.cppreference.com/w/cpp/language/new
|
||||||
|
|
||||||
|
namespace utils {
|
||||||
|
|
||||||
|
///
|
||||||
|
/// @brief Raised by @c StackAllocator when it cannot allocate the object.
|
||||||
|
///
|
||||||
|
class OutOfMemory : public StacktraceException {
|
||||||
|
public:
|
||||||
|
using StacktraceException::StacktraceException;
|
||||||
|
};
|
||||||
|
|
||||||
// Useful for allocating memory which can be freed with one call.
|
// Useful for allocating memory which can be freed with one call.
|
||||||
// Most performant for data which need to be present to the end.
|
// Most performant for data which need to be present to the end.
|
||||||
class StackAllocator {
|
class StackAllocator {
|
||||||
@ -107,3 +117,5 @@ class StackAllocator {
|
|||||||
char *head = {nullptr};
|
char *head = {nullptr};
|
||||||
char *end = {nullptr};
|
char *end = {nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace utils
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
#include "utils/exceptions/basic_exception.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
#include "utils/exceptions/stacktrace_exception.hpp"
|
|
||||||
|
|
||||||
void i_will_throw() { throw BasicException("this is not ok"); }
|
void i_will_throw() { throw utils::BasicException("this is not ok"); }
|
||||||
|
|
||||||
void bar() { i_will_throw(); }
|
void bar() { i_will_throw(); }
|
||||||
|
|
||||||
void foo() { bar(); }
|
void foo() { bar(); }
|
||||||
|
|
||||||
void i_will_throw_stacktrace_exception() {
|
void i_will_throw_stacktrace_exception() {
|
||||||
throw StacktraceException("this is not {}", "ok!");
|
throw utils::StacktraceException("this is not {}", "ok!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void bar_stacktrace() { i_will_throw_stacktrace_exception(); }
|
void bar_stacktrace() { i_will_throw_stacktrace_exception(); }
|
||||||
@ -18,8 +17,8 @@ void bar_stacktrace() { i_will_throw_stacktrace_exception(); }
|
|||||||
void foo_stacktrace() { bar_stacktrace(); }
|
void foo_stacktrace() { bar_stacktrace(); }
|
||||||
|
|
||||||
TEST(ExceptionsTest, ThrowBasicAndStackExceptions) {
|
TEST(ExceptionsTest, ThrowBasicAndStackExceptions) {
|
||||||
ASSERT_THROW(foo(), BasicException);
|
ASSERT_THROW(foo(), utils::BasicException);
|
||||||
ASSERT_THROW(foo_stacktrace(), StacktraceException);
|
ASSERT_THROW(foo_stacktrace(), utils::StacktraceException);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
@ -10,7 +10,7 @@ struct Object {
|
|||||||
};
|
};
|
||||||
|
|
||||||
TEST(StackAllocatorTest, AllocationAndObjectValidity) {
|
TEST(StackAllocatorTest, AllocationAndObjectValidity) {
|
||||||
StackAllocator allocator;
|
utils::StackAllocator allocator;
|
||||||
for (int i = 0; i < 64 * 1024; ++i) {
|
for (int i = 0; i < 64 * 1024; ++i) {
|
||||||
auto object = allocator.make<Object>(1, 2);
|
auto object = allocator.make<Object>(1, 2);
|
||||||
ASSERT_EQ(object->a, 1);
|
ASSERT_EQ(object->a, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user