Почему моя программа завершается, когда исключение выдается деструктором?

Вот свободное и вид "вне поля" способ сделать это. Не прекрасных 100%, но это должно отклонить очевидно несуществующие адреса.

Отправляют весь адрес веб-сервис геокодирования Google . Этот сервис пытается возвратить точные координаты местоположения, Вы подаете его, т.е. широта и долгота.

, По моему опыту, если адрес недопустим, Вы получите результат 602 от сервиса. Существует определенно возможность ложных положительных сторон или ложных отрицательных сторон, но используемый в сочетании с другими проверками непротиворечивости это могло быть полезно.

( веб-сервис геокодирования Yahoo , с другой стороны, возвратит координаты центра города, если город будет существовать, но остальная часть адреса является поддельной. Потенциально полезный, пока Вы обращаете пристальное внимание на поле "точности" в результате).

5
задан Assaf Lavie 11 December 2009 в 15:02
поделиться

6 ответов

Что он должен делать? Он не может «дважды поймать» или что-то в этом роде, и нет смысла просто игнорировать его. Стандарт определяет, что если во время раскрутки стека происходит выход другого исключения, то должно быть вызвано terminate .

Более подробная информация содержится в C ++ FAQ . Одно «решение» - заключить код деструктора в блок try / catch и просто не позволять исключениям ускользать.

Другое - придумать какую-то особую схему цепочки исключений. Вы бы сделали то же самое, но вместо того, чтобы игнорировать исключение, вы бы добавили его к текущему выброшенному исключению и обработали обработчик сайта вручную.

Лучшее решение, я думаю, это попытаться удалить исключительный код из вашего деструктора.

15
ответ дан 18 December 2019 в 06:35
поделиться

Причина проста ... если во время распространения исключения возникает исключение, какое исключение следует распространять? Исходное исключение или новое исключение? Если новое исключение распространяется, а затем обрабатывается, как программа узнает, что произошло другое исключение? Или исходное исключение будет проигнорировано? Это и многие другие сложности приводят к простому правилу, согласно которому единовременно может распространяться только одно исключение, а несколько сбоев приведут к завершению работы приложения.

3
ответ дан 18 December 2019 в 06:35
поделиться

Формулировка стандарта (15.2.3):

Процесс вызова деструкторов для автоматических объектов, созданных на пути от блока try к выражению throw, называется «раскручиванием стека. '' [Примечание: если деструктор, вызванный во время раскрутки стека, завершается с исключением, вызывается terminate (за исключением .terminate). Таким образом, деструкторы обычно должны перехватывать исключения и не позволять им распространяться за пределы деструктора. --- конец примечания]

В основном C ++ (как и большинство других популярных языков программирования) не имеет хорошей поддержки для обработки множественных ошибок с использованием исключений. Исключения как механизм в этом отношении просто несовершенный.

В FAQ есть предложения по Как справиться с деструктором, который не работает?

Stroustroup говорит по этому поводу ( TCPL 14.7 ):

Причина ] terminate () заключается в том, что от обработки исключений иногда приходится отказываться от менее тонких методов обработки ошибок. Например, terminate () может использоваться для прерывания процесса или, возможно, для повторной инициализации системы.

3
ответ дан 18 December 2019 в 06:35
поделиться

В пункте 8 из Эффективный C ++ говорится, что вы никогда не должны позволять исключению оставить деструктор.

1
ответ дан 18 December 2019 в 06:35
поделиться

Когда вы генерируете исключение, оно продолжает раскручивать стек до тех пор, пока не достигнет соответствующего блока catch . Как часть процесса раскрутки стека, деструкторы вызываются для каждого объекта в области каждого кадра.

Теперь, когда деструктор выдает исключение в этом случае, возникает дилемма - какой блок catch является программа должна остановиться на? Исходное исключение или новое исключение? В любом случае имеется необработанное исключение.

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

Проверьте запись FAQ-Lite , объясняющая эту точную ситуацию для получения дополнительных сведений.

1
ответ дан 18 December 2019 в 06:35
поделиться

В этом сообщении есть объяснение проблемы: http://web.tiscali.it/fanelia/cpp-faq-en/exceptions.html#faq-17.3

1
ответ дан 18 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: