Да, это возможно, если вы поставите весь код в пункте try
, для например, с помощью function try block (чтобы избежать ненужной вложенности и области видимости):
bool foo() try
{
Bar x;
x.doSomething();
return true;
}
catch (std::exception const& e)
{
return false;
}
Или в try
пункте вызове другой функции, которая делает реальную работу:
void real_foo()
{
Bar x;
x.doSomething();
}
bool foo() try
{
real_foo();
return true;
}
catch (std::exception const& e)
{
return false;
}
Обратите внимание, что часто не рекомендуется создавать исключения в конструкторе, поскольку это остановит конструкцию объекта, и его деструктор не будет вызван.
Как отметил Холт, это будет также перехватывать исключения из doSomething
вызова. Есть два пути решения, что:
Простой и стандартный способ: использовать указатели.
Используйте двухэтапную конструкцию: используйте конструктор по умолчанию, который не может генерировать исключения, а затем вызывает специальную функцию «построить», которая может генерировать исключения.
Второй способ был распространен прежде, чем C++ был стандартизован, и широко используется в коде для Symbian system. Это не часто встречается, так как использование указателей для этого намного проще и проще, особенно сегодня с хорошими интеллектуальными указателями. Я действительно не рекомендую второй способ в современном C++.
Самый простой способ - это, конечно же, убедиться, что конструктор вообще не может генерировать исключения, или если они выбрасываются, то они имеют природу, что программа не может продолжаться в любом случае и прекратить выполнение программы. Как отмечалось в комментариях к вашему вопросу, исключения на C++ являются дорогостоящими, и тогда у нас также есть проблема с оставленной конструкцией, и во всех случаях использование исключений в C++ должно выполняться только в исключительных случаях. C++ - это не Java, вы не должны рассматривать его как таковой, даже если на обоих языках есть подобные конструкции.
Если вы все еще хотите отбрасывать исключения из конструктора, на самом деле есть третий способ поймать только те: Используйте один из примеров кода вверху и бросайте только определенные исключения, которые doSomething
никогда не может выбросить, а затем поймать их только конструкторы.
Да. Поместите все на успешный путь внутри блока try. Вы останетесь в области функций. – StoryTeller
@StoryTeller, если я не хочу перехватывать исключения из, например, 'x.doSomething()', только исключения из конструктора? –
@AndrewSun Используйте разные исключения или поместите 'x.doSomething()' во внутренний блок исключений. – Holt