Первое, что вы хотите сделать, если у вас возникнет исключение bad_alloc , потому что у вас недостаточно памяти?
Я бы сказал, в классической программе C ++вы бы хотели, чтобы программа как-то пыталась сообщить вам, что произошло, а затем завершается.
В классической программе на C ++ вы бы позволили исключению bad_alloc распространиться на основной разделпрограммы.Main будет содержать несколько вариантов try / catch:
int main()
{
try
{
// your program starts
}
catch( const std::exception & e )
{
std::cerr << "huho something happened" << e.what() << std::endl;
}
catch( ... )
{
std::cerr << "huho..err..what?" << std::endl;
}
}
вы будете использовать catch (...) только внутри main и в начальных функциях потоков.В отличие от некоторых других языков, таких как Java, вы не должны отлавливать все возможные исключения локально.Вы просто позволяете им распространяться до тех пор, пока не поймаете их там, где вы хотели.
Теперь, если у вас есть код, который должен проверять std :: bad_alloc , вам нужно только catch (const std:: bad_alloc &) локально.И там, возможно, стоит сделать что-то еще, а не просто выбросить другое исключение.
Я обнаружил в языке программирования C ++ §14.10 также, что механизм обработки исключений C ++ сохраняет немного памяти для хранения исключений., так что создание исключения из стандартной библиотеки не приведет к исключению само по себе.Конечно, можно также позволить механизму обработки исключений исчерпать память, если вы действительно кодируете что-то извращенное.
Итак, подведем итог, если вы ничего не делаете и допускаете большие исключения, такие как bad_alloc хорошо распространяйся там, где хочешь их поймать, по-моему, ты в безопасности.И вы не должны использовать catch (...) или catch (const std :: exception &) где угодно, кроме основной функции и начальных функций потоков.
Перехват всех исключений для отбрасывания одного исключения - действительно последнее, что нужно сделать.Вы теряете все преимущества, которые вы получаете с механизмом обработки исключений C ++.