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

Я использую Qt Creator для проекта, и я хотел бы обрабатывать несколько исключений в своем коде Qt. Когда возникает ошибка, я хотел бы показать ее в QMessageBox::critical().

Для этого я создал класс 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

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


person Colet    schedule 11.03.2014    source источник
comment
вы ловите неправильный тип   -  person BЈовић    schedule 11.03.2014


Ответы (2)


Я думаю, что вы неправильно создаете 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());
}
person vahancho    schedule 11.03.2014
comment
После ~myExceptions() throw() я добавил фигурные скобки следующим образом: ~myExceptions() throw() { } и все заработало! - person Colet; 12.03.2014

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

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

person Spidey    schedule 11.03.2014