2015-04-06 2 views
1

Я хочу обработать исключение в созданном классе класса по умолчанию. Что-то вроде этого:C++ c-tor дескриптор конструкции элемента управления значением по умолчанию?

int func() 
{ 
    throw 9.0; 

    return 9; 
} 

struct T 
{ 
    T() try { 
    } 
    catch(...) 
    { 
     cout << __func__ << endl; 
    } 
    int a{func()}; 
} ; 

Возможно ли это? И что говорит об этом последний стандарт ISO C++?

EDIT: Я действительно проверял, что он работает на большинстве компиляторов, но четко ли он определен и должен ли я обычно использовать эту конструкцию?

+0

Я уверен, что исключение будет восстановлено, если вы его поймаете. – chris

+0

Почему так? Вы можете объяснить? – AnArrayOfFunctions

+0

Ах, * Исключенное в настоящее время исключение отменяется, если элемент управления достигает конца обработчика функции-try-block конструктора или деструктора. * – chris

ответ

2

Возможно ли это?

Да, это исключение будет обрабатываться обработчиком уровня функции точно так же, как и любой другой, инициированный инициализатором элемента. Обратите внимание, что в функции-try-block конструктора исключение возвращается после обработки. Это то, что вы хотите, если инициализация под-объекта не удалась, поскольку полный объект недействителен.

И что говорит об этом последний стандарт ISO C++?

Я не C++ 14 пока нет, но C++ 11 сказал:

15/4: Исключение брошено во время выполнения соединения-оператора или, для строителей и деструкторы, во время разрушения инициализации или, соответственно, подобъектов в классе, передает управление обработчиком в функции-Try-блоке таким же образом, как исключение, брошенном во время исполнения пытаясь угадать блок передачи управление другими обработчиками.

и 15.3/15 указывает, что в этом случае он будет восстановлен.

Должен ли я обычно использовать эту конструкцию?

Возможно, нет - мало что можно сделать, чтобы справиться с провалом инициализации подобъекта, поэтому обычно нет смысла в поиске и повторном исключении. Возможно, вы захотите сообщить об ошибке по мере прохождения исключения.

0

Это невозможно, вы можете только поймать исключение для вещи вы делаете внутри тела конструктора, как это:

struct T 
{ 
    T() { 
    try { a = func();} 
    catch(...) 
    { 
     cout << __func__ << endl; 
    } 
    } 
} 

Кроме того, вы должны поймать исключение, но не в CTOR, но где объект построен. То есть:

try { 
    T t;//construct 
} 
catch(...) 
{}; 

Таким образом, вы получите отказ при строительстве.

+1

Синтаксис в вопросе вполне допустим, если это то, что вы имеете в виду. – chris