Я использую Qt Creator для проекта и хотел бы обработать несколько исключений в своем коде Qt. Когда возникает ошибка, я хотел бы показать ее в QMessageBox :: crit ().
Для этого я создал класс myExceptions.h следующим образом:
#ifndef MYEXCEPTIONS_H
#define MYEXCEPTIONS_H
#include <iostream>
#include <exception>
using namespace std;
class myExceptions : public runtime_error
{
private:
char err_msg;
public:
myExceptions(const char *msg) : err_msg(msg){};
~myExceptions() throw();
const char *what () const throw () {return this->err_msg.c_str();};
};
#endif // MYEXCEPTIONS_H
Я вызываю исключение в моем коде следующим образом:
abc.cpp
if (!MyClass::aMethod(a, b) )
{
//setmessage of my exception
throw myExceptions("Error message to show");
}
и поймать его в моем main.cpp:
try {
MyClass2 myClass2(param);
} catch (const char &e) {
QMessageBox::critical(&window, "title", e.what());
}
Когда я делаю это, я получаю некоторые ошибки:
C2512: 'std::runtime_error': no appropriate default constructor available
C2440: 'initializing' : cannot convert from 'const char*' in 'char'
C2439: 'myExceptions::err_msg': member could not be initialized
C2228: left of '.c_str' must have class/struct/union
C2228: left of '.what' must have class/struct/union
Кто-нибудь может мне помочь? Заранее спасибо!
Я думаю, что вы неправильно конструируете runtime_error из своего пользовательского класса исключений, полученного из. Вам нужно просто сделать следующее:
class myExceptions : public runtime_error
{
public:
myExceptions(const char *msg) : runtime_error(msg) {};
~myExceptions() throw();
};
Вам не нужно реализовывать функцию what (), потому что она уже реализована в классе runtime_error.
Я также поймал бы определенный тип исключения:
try {
MyClass2 myClass2(param);
} catch (const myExceptions &e) {
QMessageBox::critical(&window, "title", e.what());
}
Вы пытаетесь инициализировать char
переменная, ваш err_msg
член myExceptions
класс со значением C-строки (msg
).
Вам необходимо скопировать сообщение в ваш класс исключений или, по крайней мере, сохранить его указатель (и убедиться, что оно будет находиться в области видимости и не изменится, пока не отобразится окно сообщения).