Который корректен? выгода (_com_error e) или выгода (_com_error& e)?

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

13
задан Chilledrat 4 May 2012 в 20:20
поделиться

4 ответа

Второе. Вот моя попытка заключения в кавычки Sutter

"Бросок значением, выгода ссылкой"

Учатся 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 */
}
28
ответ дан 1 December 2019 в 17:40
поделиться

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

6
ответ дан 1 December 2019 в 17:40
поделиться

Лично, я пошел бы для третьей опции:

catch (const _com_error& e)
13
ответ дан 1 December 2019 в 17:40
поделиться

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

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
  }
}
3
ответ дан 1 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: