Бросить строковый литерал - это, как правило, плохая идея, потому что, по мере развития кода, программистам может понадобиться добавить в сообщение об ошибке некоторую дополнительную информацию, например, значение переменной или номер строки, из которой выдается исключение.
Учитывая неизвестный клиентский код, который перехватывает const char*
, программисту предлагается использовать более динамический механизм для объединения желаемой информации:
- a
std::string
и +
- a
std::ostringstream
- буфер символов и, возможно,
strcat
и / или sprintf()
Наиболее очевидные способы их использования не работают или не работают:
// temporaries...
throw (std::string("couldn't parse input: ") + input).c_str();
throw (std::ostringstream() << "error line " << __LINE__).str().c_str();
char buf[1024]; sprintf(buf, "error line %ld%", __LINE); throw buf;
// not thread-safe
static char buf...
Даже если программист знает, что ничего из этого не нужно, у него все равно будет время найти весь клиентский код, который должен начать принимать более богатый тип значения, особенно если другое throw
/ catch
использование const char*
сохраняется.
Таким образом, использование класса, который встраивает гибкое std::string
описание по значению , очень важно для написания поддерживаемого кода.