Что правильно? поймать (_com_error e) или поймать (_com_error & e)? - PullRequest
13 голосов
/ 30 сентября 2008

Какой я должен использовать?

catch (_com_error e)  

или

catch (_com_error& e)

Ответы [ 4 ]

28 голосов
/ 30 сентября 2008

второй. Вот моя попытка процитировать Саттера

«Брось по значению, поймайте по ссылке»

Научитесь catch правильно: генерировать исключения по значению (не по указателю) и лови их по ссылке (обычно на const). Это комбинация это лучше всего сочетается с семантикой исключений. При отбрасывании того же исключение, предпочитайте просто throw; throw e;.

Вот полный Позиция 73. Бросок по значению, улов по ссылке.


Причина, по которой следует избегать перехвата исключений по значению, заключается в том, что он неявно создает копию исключения. Если исключение относится к подклассу, информация о нем будет потеряна.

try { throw MyException ("error") } 
catch (Exception e) {
    /* Implies: Exception e (MyException ("error")) */
    /* e is an instance of Exception, but not MyException */
}

Функция перехвата по ссылке позволяет избежать этой проблемы, не копируя исключение.

try { throw MyException ("error") } 
catch (Exception& e) {
    /* Implies: Exception &e = MyException ("error"); */
    /* e is an instance of MyException */
}
12 голосов
/ 30 сентября 2008

Лично я бы пошел на третий вариант:

catch (const _com_error& e)
6 голосов
/ 30 сентября 2008

Также обратите внимание, что при использовании MFC вам может потребоваться поймать по указателю . В противном случае, ответ @ JaredPar - это путь, которым вы обычно должны следовать (и, надеюсь, вам никогда не придется иметь дело с вещами, которые бросают указатель).

3 голосов
/ 30 сентября 2008

Определенно второе. Если у вас было следующее:

class my_exception : public exception
{
  int my_exception_data;
};

void foo()
{
  throw my_exception;
}

void bar()
{
  try
  {
    foo();
  }
  catch (exception e)
  {
    // e is "sliced off" - you lose the "my_exception-ness" of the exception object
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...