Что забавно, так это то, что Java проверила исключения, и программисты на Java тоже их ненавидят.
Спецификации исключений в C ++ бесполезны по 3 причинам:
1. Спецификации исключений C ++ запрещают оптимизацию.
За исключением, возможно, функции throw (), компиляторы вставляют дополнительный код, чтобы проверить, соответствует ли оно при спецификации исключения функциям во время перемотки стека. Способ замедлить вашу программу.
2. Спецификации исключений C ++ не обеспечиваются компилятором
Что касается вашего компилятора, то синтаксически правильно следующее:
void AStupidFunction() throw()
{
throw 42;
}
Что еще хуже, ничего полезного не произойдет, если вы нарушите спецификацию исключения. Ваша программа просто заканчивается!
3. Спецификации исключений в C ++ являются частью сигнатуры функции.
Если у вас есть базовый класс с виртуальной функцией и вы пытаетесь его переопределить, спецификации исключений должны точно совпадать. Так что вам лучше планировать заранее, а это все еще боль.
struct A
{
virtual int value() const throw() {return 10;}
}
struct B : public A
{
virtual int value() const {return functionThatCanThrow();} // ERROR!
}
Спецификации исключений дают вам эти проблемы, и выгода от их использования минимальна. Напротив, если вы вообще избегаете спецификаций исключений, кодирование становится проще, и вы избегаете этого.