c ++ исключения, что может () быть NULL? - PullRequest
8 голосов
/ 24 июня 2009

Может ли когда-либо обнаруженное исключение std ::: иметь () значение NULL?

Проверка e.what () ниже накладных расходов?

//...
}
catch (const std::exception& e)
{
  std::string error;
  if(e.what())
    error = e.what();
}

Ответы [ 4 ]

13 голосов
/ 24 июня 2009

Содержимое строки определяется реализацией, поэтому я предполагаю, что ответ - да.

Редактировать: Страхуй это. Стандарт гласит:

virtual const char* what() const throw();
5 Returns: An implementation-defined NTBS.

Так что он должен возвращать строку, а не только указатель. И строка не может быть NULL. Как отмечали другие, легко получить исключения, для которых what() возвращает NULL, но я не уверен, как такие вещи вписываются в соответствие стандартам. Конечно, если вы реализуете what () в своем собственном классе исключений, я бы посчитал очень плохой практикой разрешать ему возвращать NULL.

Подробнее:

Дополнительный вопрос, касающийся вопроса о том, может ли what() возвращать NULL, и другие подобные интересные вопросы, см. В Расширение стандартной библиотеки C ++ с помощью наследования?

5 голосов
/ 24 июня 2009

Если кто-то унаследовал от std :: exception и переопределил, что возвращать NULL, то это возможно.

   class CMyException : public std::exception
   {
   ...
       virtual const char * what () const {return NULL;}
   };

Несмотря на отличную находку Нейла в стандарте, все равно было бы неплохо проверить на NULL. Хотя спецификации того, какие дочерние классы std :: exception указывают, что они не должны возвращать NULL, ничего в вашем компиляторе не будет обеспечивать это, и приведенный выше код все равно будет допустимым в соответствии с языком.

Это может быть идеальная ситуация, чтобы использовать assert ...

 assert(except.what() != NULL);

или

 if (except.what() != NULL)
 {
      ... normal processing ...
 }
 else
 {
      assert(false);
 }

потому что это тот случай, когда что-то, вероятно, никогда не должно происходить, и вы предполагаете, что этого не должно происходить, но все же хотели бы знать (в режиме отладки), когда ваши предположения оказываются неверными. Затем вы можете обратиться к неверному предположению или к неверному коду, который может противоречить вашему предположению (убедитесь, что what () не возвращает NULL).

2 голосов
/ 24 июня 2009

Конечно, это может быть NULL:

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return NULL;
  }
} myex;
0 голосов
/ 24 июня 2009

Как отмечали многие другие, what() не должен возвращать нулевой указатель, но может . Затраты времени выполнения нулевого теста возникают только в исключительном случае, когда, по-видимому, он менее важен.

В любом случае, я бы рекомендовал хотя бы использовать assert.

Если пространство кода также вызывает беспокойство, мы надеемся, что assert, ваше тестирование, обзоры кода и другие проверки качества будут достаточно полными, чтобы отследить любые оскорбительные несоответствующие исключения перед отправкой.

Кроме того, будьте осторожны с кодом обработки исключений, который может сам генерироваться (например, как уже отмечали другие, выделяя память с помощью std::string при обработке исключения std::bad_alloc.)

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