C ++ - Исключение в конструкторе - PullRequest
0 голосов
/ 26 февраля 2020

У меня проблема. Я должен бросить исключение в конструктор One (), но не знаю, как мне его перехватить. Может кто-то что-то предложить? Я пробовал этот метод: Бросать исключения из конструкторов , Что произойдет, если конструктор выдает исключение?

Мой код:

class One
{
    int a, b;

public:

    One()
    {
        a = 7;
        b = 0;
        if (b == 0)
        {
            throw "except";
        }       
    }

};
int main()
{
    One j;
    try 
    {
        cout << "good"; 
    }
    catch(const char *str)
    {
        cout << str;
    }
}

Ответы [ 3 ]

6 голосов
/ 26 февраля 2020

Поместите определение переменной в блок try:

try 
{
    One j;
    std::cout << "good"; 
}
catch(const char *str)
{
    std::cout << str;
}
2 голосов
/ 26 февраля 2020

Прежде всего, не бросайте не исключение. 2. Если вы вызываете конструктор внутри блока try, вы можете перехватить его.

#include <iostream>
#include <stdexcept>

class One
{
    int a, b;
public:
    One():
     a(7),
     b(0) 
   {
        if (b == 0) {
            throw std::runtime_error("except");
        }       
   }

};

...

try { 
   One j; 
   std::cout << "good" << std::endl; 
} catch(std::exception& e) { 
   std::cerr << e.what() << std::endl; 
} 
0 голосов
/ 26 февраля 2020

Другое решение, если вы не хотите, чтобы весь код был внутри блока try..catch:

int main()
{
  One* j = nullptr;
  try 
  {
      j = new One;
      cout << "good"; 
  } catch (const char *str)
  {
      cout << str;
      return 0;
  }
  // continue with object in j ...
}

И, конечно, в этом случае вам нужен умный указатель:

int main()
{
  std::unique_ptr< One> j;
  try 
  {
      j.reset( new One());   // or use std::make_unique<>()
      cout << "good"; 
  } catch (const char *str)
  {
      cout << str;
      return 0;
  }
  // continue with object in j ...
}
...