Спецификации исключений не являются удивительно полезными инструментами в C ++. Тем не менее, есть / есть / хорошее применение для них, если в сочетании с std :: surprise.
В некоторых проектах я делаю код со спецификациями исключений, а затем вызываю set_unexpected () с функцией, которая вызывает специальное исключение из моего собственного дизайна. Это исключение при создании получает обратную трассировку (в зависимости от платформы) и является производной от std :: bad_exception (чтобы разрешить его распространение при желании). Если это вызывает вызов terminate (), как это обычно происходит, обратная трассировка печатается с помощью what () (а также исходного исключения, которое его вызвало; не трудно это найти), и поэтому я получаю информацию о том, где был мой контракт нарушено, например, возникла непредвиденная исключительная ситуация библиотеки.
Если я сделаю это, я никогда не разрешу распространение исключений библиотеки (кроме std) и получу все мои исключения из std :: exception. Если библиотека решит выбросить, я поймаю и преобразую в свою собственную иерархию, что позволит мне всегда контролировать код. Шаблонные функции, которые вызывают зависимые функции, должны избегать спецификаций исключений по очевидным причинам; но в любом случае редко иметь шаблонный интерфейс функций с библиотечным кодом (и лишь немногие библиотеки действительно используют шаблоны полезным способом).