РЕДАКТИРОВАТЬ : С момента написания этого ответа я наткнулся на раздел Обработка ошибок и исключений в документе Boost.Я бы рекомендовал этот документ поверх этого ответа.
Прежде всего, сделать ваше исключение не подлежащим копированию - плохая идея.Когда вы пишете что-то вроде
// could be any exception, doesn't matter.
throw Exception(...);
Среда выполнения создает копию этого объекта в специальном месте.Некоторые компиляторы могут оптимизировать это и создать исходный объект в этом месте, но Язык программирования C ++ говорит, что это копия, и я также считаю, что это говорит стандарт, хотя я не уверен.Вам может это сойти с рук в вашей текущей среде, но это не всегда так.
Тогда все остальное зависит от того, насколько вы параноидальны с угловыми случаями.
Часть выделения памятив основном исключение в предложении исключения (т.е. конструктор).Если это выделение памяти происходит неудачно (т. Е. Выбрасывается std::bad_alloc
), есть две возможности, в зависимости от того, как вы пишете оператор throw
:
std::string
создается до throw
оператор, std::bad_alloc
заменяет исключение, которое, как вы думали, возникнет, проблема вроде плохо сообщена. std::string
создается встроенным в вызове конструктора.Если в стандарте это считается «во время обработки исключений», то будет вызван std::unexpected()/std::terminate()
, и вы в основном получите дамп ядра.
В любом случае кажется, что вы не получите желаемогоЭффект сообщения об ошибке.
Я всегда рекомендую создать какое-то временное состояние, которое не выделяет память в конструкторе, и дождаться вызова std::what()
, чтобы создать строку, сообщающую об ошибке, ноэто все еще может привести к делу № 1.Вы можете прибегнуть к некоторому определенному во время компиляции размеру буфера, чтобы убедиться, что этого не произойдет.
Многие люди скажут вам, что у них никогда не было проблем с выделением строк в конструкторах, поскольку маловероятно, что std::bad_alloc
будетповышается, если исходное исключение не было std::bad_alloc
в первую очередь.Следовательно, это зависит от вашего уровня паранойи.