бросая повышение :: shared_ptr <customException> - PullRequest
1 голос
/ 07 марта 2011

есть ли какие-либо ловушки из следующих;

 if (someCondition)
   throw boost::shared_ptr<SomeException>( new SomeException( "foo!" ) );

 ...

 catch( const boost::shared_ptr<SomeException>& expRef )
 {
 }

Ответы [ 3 ]

6 голосов
/ 07 марта 2011

Вы должны избегать броска по указателю и предпочитать бросок по значению и отлов по (постоянной) ссылке .

Использование умного указателя - это способ упростить управление ресурсами при использовании указателей, но если вы можете вообще избежать использования указателей, это будет проще сделать. Просто бросьте значение.

4 голосов
/ 07 марта 2011

Да, здесь есть подводный камень.Вы не сможете поймать на основе базовых классов:

void f()
{
  throw std::runtime_error("look here");
}
void g()
{
  throw boost::shared_ptr<std::runtime_error>("look here");
}

int main()
{
  try
  {
    f();
  }
  catch ( std::exception const& e) {}

  try { g(); }
  catch ( boost::shared_ptr<std::exception> const& e) {} // no work
}

Конечно, вы можете заставить его бросать на базу, но тогда вы не сможете поймать производные.... не делай этого.

1 голос
/ 07 марта 2011

Единственная ловушка, которую я вижу, это то, что вы делаете что-то нелегко, когда вам не нужно. : -)

Обычно вы используете shared_pointer для управления временем жизни объекта, в противном случае это не очевидно. Здесь ясно, что ваша не является обязанностью управлять созданными исключениями. Компилятор должен сделать это за вас!

Когда обработано исключение, среда выполнения уничтожит shared_pointer, который затем уничтожит объект исключения. В противном случае среда выполнения уничтожила бы объект исключения напрямую! Что вы получаете?

...