Как вы создаете объект, который может генерировать исключение? - PullRequest
1 голос
/ 24 апреля 2020

Это выходит за пределы go, поэтому я не могу его использовать.

try
{
    SomeClass someObject({});
}
catch (std::exception & e)
{

}

someObject(x); // someObject does not exist because it goes out of scope

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Вот полезное приложение: std::optional.

std::optional<SomeClass> maybe_someobject;

try {
     maybe_someobject.emplace( /* Constructor parameters go here */);
} catch (...  /* or something specific */)
{
     /* catch exceptions */
     return; // Do not pass "Go". Do not collect $200.
}

SomeClass &someobject=maybe_someobject.value();

// Use someobject normally, at this point. Existing code will have to look
// very hard to be able to tell the difference.

Это добавляет немного накладных расходов, но это довольно минимально, но вы сохраняете полный тип и безопасность RAII.

1 голос
/ 24 апреля 2020

Создайте объект динамически, например:

SomeClass *someObject = nullptr;

try
{
    someObject = new SomeClass(...);
}
catch (const std::exception &e)
{

}

// or:
// SomeClass *someObject = new(nothrow) SomeClass(...);

if (someObject)
{
    // use someObject as needed...
    delete someObject;
}

В качестве альтернативы:

std::unique_ptr<SomeClass> someObject;

try
{
    someObject.reset(new SomeClass(...));
    // or:
    // someObject = std::make_unique<SomeClass>(...);
}
catch (const std::exception &e)
{

}

if (someObject)
{
    // use someObject as needed...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...