Может ли кто-нибудь объяснить Исключительные спецификации, используемые в С++?
- Когда они используются (я редко видел, что он используется в коде)
- Каковы преимущества и недостатки (преимущества/недостатки) использования спецификаций исключений?
Может ли кто-нибудь объяснить Исключительные спецификации, используемые в С++?
Когда они используются (я редко видел, что он используется в коде)
Надеюсь, никогда, поскольку они устарели в следующей версии С++ из-за стандартизации в следующем году.
Каковы преимущества и недостатки (преимущества/недостатки) использования спецификаций исключений?
Они дают возможность читателям вашего кода точно знать, какие исключения разрешено выполнять функции. Проблема заключается в том, что если выдается неожиданное исключение (не в спецификации), то программа будет прекращена (по умолчанию).
Они обычно считаются плохими идеями.
Говорят, что бросит метод. Недостатком является то, что если этот метод выбрасывает что-либо еще, ваше приложение завершается. Таким образом, это гарантия, но не так, как это делает Java. И это добавляет накладные расходы на проверку.
Важно знать: спецификации исключений устарели в следующей версии С++, за исключением спецификатора no-throw (throw()
), который в основном официально говорит "не использовать их".
Помещение throw()
после функции означает, что функция не выбрасывает никаких исключений. Если это так или иначе, приложение будет прекращено (возможно, вызван непредвиденный обработчик), поэтому остальная часть вашего приложения может использовать эту функцию, зная, что это не вызовет исключения. Это может быть удобно для написания исключающего код кода.
Пример:
void MyFunction() throw() // does not throw any exceptions
{
/* ... */
{
Они указывают программисту, какие исключения будут выбрасываться из этой функции. Они имеют то преимущество, что у вас есть гарантия, что никакие другие исключения не могут быть исключены из этой функции. Тем не менее, нет проверки времени компиляции того, действительно ли функция генерирует исключения, отличные от того, что указано в спецификаторе throw. Вместо этого он проверяется во время выполнения. И если он терпит неудачу, то вызывается unexpected()
, который по умолчанию вызывает abort()
, который по очереди по умолчанию завершает вашу программу. Итак, если вы действительно не хотите, чтобы ваша программа умерла, если вы испортились, и неожиданное исключение выбрасывается, вероятно, плохая идея использовать их.
Одно место, где я бы рекомендовал использовать их, - это деструкторы. Это очень плохо, если деструктор бросает. Они никогда не должны бросать. Итак, если вы используете throw()
для деструктора, чтобы указать, что он не может генерировать исключение, то вы знаете, что ваша программа умрет, а не продолжит в плохом состоянии, что она будет находиться после исключения из деструктора исключения.
Независимо, если вы используете какой-либо спецификатор throw, вы должны быть уверены, что действительно хотите, чтобы ваша программа умерла, если она нарушена. Итак, вообще говоря, лучше не использовать их.
В принципе, спецификации исключений позволяют компилятору оптимизировать стек. Недостатком является то, что это чертовски много дополнительных спецификаций. Это означает, что вы обычно видите это в работе с библиотекой, но не столько в рабочем коде.
Я считаю, что там тоже есть какая-то компиляция, но, поскольку я никогда не использовал ее, я не могу быть уверен.