пятница, 3 сентября 2010 г.

Function try block

Думаю, многие применяли try-catch блоки для ловли исключений. Однако, есть у этих блоков одна малоизвестная особенность введенная в стандарт в 1995 году. Называется function-try-block и применяется, в основном, для того, чтобы поймать исключения в списке инициализации конструктора. Рассмотрим небольшой пример:
struct A
{
private:
  std::string s;
public:
  A( int value ) : s( boost::lexical_cast<std::string>( value ) ) {}
};

Что будет с данным кодом, если boost::lexical_cast вдруг выкинет исключение? А будет то, что экземпляр класса A не создастся. Это может быть совсем не то, что мы хотим. Как раз для таких целей и нужен function-try-block. Выглядить это будет так:
struct A
{
private:
  std::string s;
public:
  A( int value ) try : s( boost::lexical_cast<std::string>( value ) ) {}
  catch ( boost::bad_lexical_cast ) { /* handle lexical_cast exception here */ }
};

Обратите внимание в каком месте находится ключевое слово try.

Комментировать в ВКонтакте