Пожалуйста, обратите внимание на следующее бросании исключения и ловли:Улавливает ли исключение ссылкой ссылкой?
void some_function() {
throw std::exception("some error message");
}
int main(int argc, char **argv) {
try {
some_function();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
exit(1);
}
return 0;
}
Безопасно, чтобы поймать брошенное исключение по ссылке?
Меня беспокоит то, что исключение e
на самом деле , размещенное в стеке of some_function()
. Но some_function()
только что вернулся, в результате чего e
будет уничтожен. Итак, на самом деле теперь e
указывает на разрушенный объект.
Является ли мое беспокойство правильным?
Каков правильный способ передачи исключения без копирования его по значению? Должен ли я бросать new std::exception()
, чтобы он был помещен в динамическую память?
Обратите внимание, что конструктор строк для std :: exception не является стандартным, это расширение MS (соответствующее?). http://stackoverflow.com/questions/5157206/why-does-stdexception-have-extra-constructors-in-vc – Sigismondo
Итак, как вы можете назначить сообщение исключению, поэтому оно печатается с помощью 'what()'? – SomethingSomething
@SomethingSomething вы использовали бы производную от 'std :: exception', которая позволяет передавать сообщение конструктору. Например, 'std :: runtime_error'. И соглашение о метании подтипов является именно той причиной, по которой вы должны поймать ссылку (const). – user2079303