Создание пользовательского исключения из вложенной функции C ++ - PullRequest
0 голосов
/ 01 мая 2018

У меня есть пользовательский класс исключений ниже:

#include <exception>

#pragma once
class MyException : public std::exception
{
public:
    MyException ();
    MyException (std::string message="");
    virtual const char* what()throw();
private:
    std::string m_exceptionMessage;
};

Соответствующий файл .cpp имеет правильные определения.

Вот как вложена моя функция:

f1();
f2();
void main()
{
   try
   {
      f1();
   }

   catch (std::exception &ex)
   {
      std::cerr << ex.what() << std::endl;
   }
}

void f1()
{
   try
   {
      f2();
   }
   catch (std::exception &ex)
   {
      throw std::exception(ex);
   }
}

void f2()
{
   try
   {
      InitCalculations();
      hr = DoSomething();
      if(hr!=S_OK)
          throw MyException ("invalid argument")
   }
   catch (std::exception &ex)
   {
      throw std::exception(ex);
   }

}

Я попытался обобщить проблему. Все функции лежат в разных файлах под разными заголовками. Я получаю правильную передачу сообщения в первый перехват функции f2(), однако, когда я пытаюсь распространить это сообщение, я теряю его в f1() и, следовательно, в main() Как правильно распространить исключение из f2() в функцию main()?

1 Ответ

0 голосов
/ 01 мая 2018

throw std::exception(ex); создает новый объект исключения, который больше не является MyException. Вот почему вы потеряете сообщение. Вам нужно использовать только throw;, оно сбрасывает существующее пойманное исключение.

И, кстати. Вы не должны использовать std::string или любой другой объект, который выделяется из кучи внутри вашего исключения. Программа могла выдать исключение из-за нехватки памяти, и std::string затем выбросит еще одно, потому что не может выделить буфер, в результате чего ваша программа завершает работу.

Используйте const char * литерал, а если вам нужен переменный текст, используйте статически выделенный буфер char[] и заполните его sprintf().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...