Вот свободное и вид "вне поля" способ сделать это. Не прекрасных 100%, но это должно отклонить очевидно несуществующие адреса.
Отправляют весь адрес веб-сервис геокодирования Google . Этот сервис пытается возвратить точные координаты местоположения, Вы подаете его, т.е. широта и долгота.
, По моему опыту, если адрес недопустим, Вы получите результат 602 от сервиса. Существует определенно возможность ложных положительных сторон или ложных отрицательных сторон, но используемый в сочетании с другими проверками непротиворечивости это могло быть полезно.
( веб-сервис геокодирования Yahoo , с другой стороны, возвратит координаты центра города, если город будет существовать, но остальная часть адреса является поддельной. Потенциально полезный, пока Вы обращаете пристальное внимание на поле "точности" в результате).
Что он должен делать? Он не может «дважды поймать» или что-то в этом роде, и нет смысла просто игнорировать его. Стандарт определяет, что если во время раскрутки стека происходит выход другого исключения, то должно быть вызвано terminate
.
Более подробная информация содержится в C ++ FAQ . Одно «решение» - заключить код деструктора в блок try / catch и просто не позволять исключениям ускользать.
Другое - придумать какую-то особую схему цепочки исключений. Вы бы сделали то же самое, но вместо того, чтобы игнорировать исключение, вы бы добавили его к текущему выброшенному исключению и обработали обработчик сайта вручную.
Лучшее решение, я думаю, это попытаться удалить исключительный код из вашего деструктора.
Причина проста ... если во время распространения исключения возникает исключение, какое исключение следует распространять? Исходное исключение или новое исключение? Если новое исключение распространяется, а затем обрабатывается, как программа узнает, что произошло другое исключение? Или исходное исключение будет проигнорировано? Это и многие другие сложности приводят к простому правилу, согласно которому единовременно может распространяться только одно исключение, а несколько сбоев приведут к завершению работы приложения.
Формулировка стандарта (15.2.3):
Процесс вызова деструкторов для автоматических объектов, созданных на пути от блока try к выражению throw, называется «раскручиванием стека. '' [Примечание: если деструктор, вызванный во время раскрутки стека, завершается с исключением, вызывается terminate (за исключением .terminate). Таким образом, деструкторы обычно должны перехватывать исключения и не позволять им распространяться за пределы деструктора. --- конец примечания]
В основном C ++ (как и большинство других популярных языков программирования) не имеет хорошей поддержки для обработки множественных ошибок с использованием исключений. Исключения как механизм в этом отношении просто несовершенный.
В FAQ есть предложения по Как справиться с деструктором, который не работает?
Stroustroup говорит по этому поводу ( TCPL 14.7 ):
Причина ] terminate () заключается в том, что от обработки исключений иногда приходится отказываться от менее тонких методов обработки ошибок. Например, terminate () может использоваться для прерывания процесса или, возможно, для повторной инициализации системы.
В пункте 8
из Эффективный C ++ говорится, что вы никогда не должны позволять исключению оставить деструктор.
Когда вы генерируете
исключение, оно продолжает раскручивать стек до тех пор, пока не достигнет соответствующего блока catch
. Как часть процесса раскрутки стека, деструкторы вызываются для каждого объекта в области каждого кадра.
Теперь, когда деструктор выдает исключение в этом случае, возникает дилемма - какой блок catch
является программа должна остановиться на? Исходное исключение или новое исключение? В любом случае имеется необработанное исключение.
Программа не умеет принимать подобные решения, поэтому в стандарте говорится, что она даже не пытается решить проблему и просто сдается.
Проверьте запись FAQ-Lite , объясняющая эту точную ситуацию для получения дополнительных сведений.
В этом сообщении есть объяснение проблемы: http://web.tiscali.it/fanelia/cpp-faq-en/exceptions.html#faq-17.3