Оператор отладки Catch Block не выполняется после возникновения исключения? - PullRequest
0 голосов
/ 06 апреля 2019

Проблема

У меня есть исключение GLSLFailedToLoadException, которое является производным от класса исключения GlHelperException.

В GlHelperException есть функция виртуального выброса для описания ошибки со свойством title исключения и номером строки симя_файла.

Но когда я проверяю исключение в основной функции, блок catch не печатает правильный журнал отладки функции what () и возвращает терминат, вызванный после генерирования исключения GLSLFailtedToLoadException.

Определение исключительной ситуации


class GlHelperException: public std::exception{
public:
    virtual const char* what() const throw(){
        return (std::string(this->title) + 
        " - in file " + 
        std::string(this->filename) + 
        " at line " + 
        std::to_string(this->line)).c_str();    
    }

protected:

    const char *title;
    const char *filename;
    int line;
};


class GLSLFailedToLoadException: public GlHelperException{
public:
    GLSLFailedToLoadException(const char *filename, int line);
};


GLSLFailedToLoadException::GLSLFailedToLoadException(const char *filename, int line){
    this->filename = filename;
    this->line = line;
    this->title = "Failed to load and compile GLSL program ";
}

Место проведения теста



int main(int argc, char **argv){
/* Irrelevant Code*/

    try{
        throw new GLSLFailedToLoadException(__FILE__, __LINE__);
    }
    catch(GLSLFailedToLoadException &e){
        std::cout<<"Exception Caught"<<std::endl;
        std::cout<<e.what()<<std::endl;
    }
    return 0;
}

Фактические результаты

terminate called after throwing an instance of 'GLSLFailedToLoadException*'
Aborted (core dumped)

Ожидаемые результаты

Failed to load and compile GLSL program in __FILE__ at __LINE__

1 Ответ

2 голосов
/ 06 апреля 2019

Вы бросаете указатель на объект, но пытаетесь поймать объект (по ссылке).

Измените свой оператор throw, чтобы бросить объект:

throw GLSLFailedToLoadException(__FILE__, __LINE__);

Я бытакже рекомендуем всегда catch исключений по ссылке const, поэтому:

catch (const GLSLFailedToLoadException& e)

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

Вам также нужно использовать std::string s в вашем объекте исключения, а не указатели (const char *), потому что хранящиеся в данный момент указатели не живут в течение продолжительностиобъекта, поэтому вам нужно сделать копии указанных строк.

...