У меня есть класс исключений c ++ 14, базовое исключение, которое наследуется от std :: exception. Из базового класса я создал производные исключения, два из них показаны в коде ниже (BadRequest и ServerError).
это мой класс исключений, следующий код:
#ifndef CODEDATABASE_MYEXCEPTIONS_HPP
#define CODEDATABASE_MYEXCEPTIONS_HPP
#include <string>
#include <utility>
using namespace std;
class MyException : public exception {
protected:
public:
MyException(string error, uint32_t code, string type) :
error_(move(error)), code_(code),type_(move(type)) {}
public:
const std::string &getError() const {
return error_;
}
uint32_t getCode() const {
return code_;
}
const std::string &getType() const {
return type_;
}
private:
string error_;
uint32_t code_;
string type_;
};
class BadRequest : public MyException {
public:
explicit BadRequest(const string& message):
MyException("BadRequest error: " + message, 400, "BadRequest") {
}
};
class ServerError : public MyException {
public:
explicit ServerError(const string& message):
MyException("Server error: " + message, 500, "ServerError") {
}
};
#endif //CODEDATABASE_MYEXCEPTIONS_HPP
и вот мой код драйвера, чтобы проверить эти исключения
#include <iostream>
#include "catch.hpp"
#include "exceptions/MyExceptions.hpp"
void internal_raise(bool badrequest) {
if (badrequest) {
throw BadRequest("a bad request");
} else {
throw ServerError(" a server error");
}
}
void raise_exception(bool badrequest) {
try {
internal_raise(badrequest);
} catch (MyException& e) {
throw e; //WARNING IS REPORTED
}
}
TEST_CASE("work on exceptions", "[exceptions]") {
try {
raise_exception(true);
} catch (MyException& e) {
std::cout << e.getError() << std::endl;
}
try {
raise_exception(false);
} catch (MyException& e) {
std::cout << e.getError() << std::endl;
}
}
Код работает, однако яполучаю предупреждение, что я не понимаю, и я хотел бы знать, как это исправить
Тип сгенерированного исключения не является копируемым.
Об этом сообщаетсяв методе lift_exception в операторе «throw e». Почему я работаю? Как правильно избежать этого предупреждения?