Они указывают программисту, какие исключения будут выброшены из этой функции.У них есть преимущество в том, что у вас есть гарантия того, что никакие другие исключения не могут быть выброшены из этой функции.Однако во время компиляции нет проверки того, действительно ли функция генерирует какие-либо исключения, кроме тех, которые указаны в спецификаторе throw.Вместо этого он проверяется во время выполнения.И если это не удается, то вызывается unexpected()
, который по умолчанию вызывает abort()
, что, в свою очередь, по умолчанию завершает вашу программу.Так что, если вы действительно не хотите, чтобы ваша программа умерла, если вы облажались и возникло непредвиденное исключение, возможно, это плохая идея.
Единственное место, где я бы порекомендовал использовать их, это деструкторы.Это действительно плохо, если бросает деструктор.Они должны никогда бросать.Итак, если вы используете throw()
для деструктора, чтобы указать, что оно не может вызвать исключение, то вы знаете, что ваша программа умрет, а не продолжит работать в плохом состоянии, в котором она была бы после того, как исключение было сгенерировано из деструктора..
В любом случае, если вы используете какой-либо спецификатор броска, вы должны быть уверены, что действительно хотите, чтобы ваша программа умерла, если она нарушена.Так что, вообще говоря, лучше не использовать их.