Вопрос

я читаю эту страницу http://www.cplusplus.com/doc/tutorial/exceptions.html там написано, что если я напишу function(), то throw();в этой функции не может быть создано никаких исключений.Я пробовал в msvc 2005 писать throw(), throw(int), throw() и вообще ничего.каждый из них дал совершенно одинаковые результаты.Ничего.Я выбросил int, char *, другой тип, и все это было поймано таким же образом.Похоже, что бросок вообще на это не влияет.Что на самом деле делает функция() throw()?

Это было полезно?

Решение

Видишь эта статья для получения подробной информации о спецификациях исключений C ++ и реализации Microsoft:

Microsoft Visual C ++ 7.1 игнорирует спецификации исключений, если только они не являются пустыми.Спецификации пустого исключения эквивалентны __declspec(nothrow), и они могут помочь компилятору уменьшить размер кода.

[...] Если он увидит пустую спецификацию исключения, он предположит, что вы знаете, что делаете, и оптимизирует механику работы с исключениями.Если ваша функция все равно выдает ошибку - что ж, как вам не стыдно.Используйте эту функцию только в том случае, если вы на 100% уверены, что ваша функция не выдает сбоев и никогда не будет.

Другие советы

Что вы обнаруживаете, так это то, что эта версия VC ++ не применяла исключения спецификации.Я полагаю, что это было задокументировано как отклонение от стандарта.

Однако спецификации исключений обычно не являются хорошей идеей.Если программа нарушает их в реализации, соответствующей стандартам (чего в данном случае не было в VC ++ из VS 2005), предполагается, что система это поймает.Это означает, что спецификация не является подсказкой по оптимизации компилятора, а скорее заставляет компилятор идти на дополнительные меры и иногда выдавать неоптимальный код.

Видишь обоснование повышения по причинам, по которым высоко оцененный проект Boost не использует спецификации исключений.Это Boost, который является чем-то вроде детского плаката для того, чтобы делать странные и полезные вещи с продвинутыми частями языка.

Цитирую из Прагматичный взгляд на спецификации исключений:

(Неправильное) понимание

Вторая проблема связана с знанием того, что вы получаете.Как выразились многие известные люди, включая авторов спецификации исключения Boost обоснование, программисты склонны использовать спецификации исключений так, как если бы они вели себя так, как хотелось бы программисту, вместо того, как они на самом деле ведут себя.

Вот что многие люди думают, что спецификации исключений делают:

  • Гарантируйте, что функции будут выдавать только перечисленные исключения (возможно, ни одного).

  • Включите оптимизацию компилятора, основываясь на знании того, что будут выдаваться только перечисленные исключения (возможно, ни одного) .

Приведенные выше ожидания, опять же, обманчиво близки к истине.

Смотрите ссылку для получения более подробной информации.

Создания исключения недостаточно, вам нужен try {} catch() блокируйте для перехвата исключений.Если вы не улавливаете исключения, std::terminate() вызывается, и ваша программа резко завершается.Возьмите небольшой тайм-аут и займитесь это.

технические характеристики броска предназначены для двух целей:

  1. Чтобы служить контрактом между реализованным интерфейсом и пользователем интерфейса - вы указываете, какие исключения могут быть выброшены из вашего метода, некоторые люди считают это частью интерфейса.(контракт) Ala проверил исключения в Java.

  2. Как способ сигнализировать компилятору, что он может применить определенные оптимизации в случае, если из метода / процедуры не может быть создано никаких исключений (настройка обработки исключений чего-то стоит)

Однако выдача исключения, не указанного в предложении throw(), является ошибкой ни в коем случае реализация не требуется для его проверки для тебя.На самом деле это даже невозможно проверить, поскольку оно включает в себя все возможные исключения из подпрограмм, которые вызывает ваша подпрограмма.(возможно, из других модулей) Это невозможно даже в рамках одного модуля, так как легко сводится к проблеме остановки :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top