Настройте исключения, показывая сообщения об ошибках C ++ и Qt

Я использую 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

Кто-нибудь может мне помочь? Заранее спасибо!

0

Решение

Я думаю, что вы неправильно конструируете 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());
}
3

Другие решения

Вы пытаетесь инициализировать char переменная, ваш err_msg член myExceptions класс со значением C-строки (msg).

Вам необходимо скопировать сообщение в ваш класс исключений или, по крайней мере, сохранить его указатель (и убедиться, что оно будет находиться в области видимости и не изменится, пока не отобразится окно сообщения).

1

По вопросам рекламы [email protected]