Обработка исключений экспатов
Я изо всех сил пытался выяснить, почему исключения, сгенерированные из обработчика событий StartElement, не перехватываются моим приложением, которое использует парсер Expat (в C). Приложение просто завершает работу, говоря, что оно не может найти блоки catch, хотя у меня есть все блоки catch. Просто из-за того, что исключения генерируются из моих собственных обработчиков событий, API-интерфейс XML_Parse не может передать его в мой код, где у меня есть все блоки catch. Один из пользователей stackru с именем "Michael Anderson" предложил перестроить expat lib с необходимыми флагами gcc, чтобы заставить expat lib обрабатывать исключения. Может кто-нибудь сообщить мне, что это за флаги? Или предложить лучший способ обработки ошибок в обработчиках событий, таких как стартовый элемент, элемент и т. д.
Я почему-то хочу, чтобы XML_Parse API возвращал 0, если я столкнулся с каким-либо исключением в моих зарегистрированных обработчиках событий. Пожалуйста помоги. Заранее спасибо.
Вот код:
try
{
if( ! XML_Parse(.....) )
{
throw exception;
}
}
catch(...)
{
}
В рабочем сценарии, если XML_Parse обнаруживает искаженный xml-файл, он сразу же возвращает ноль, и я получаю исключение if block и throw, и оно ловится нормально. Но в проблемном случае исключения генерируются из обработчиков событий, но мое приложение сбрасывает ядро, и стек ядра говорит, что не может найти catch и, наконец, вызывает std::terminate и abort. Теперь, как мне заставить XML_Parse возвращать ноль, когда я хочу выбросить пользовательское исключение из обработчиков событий?
1 ответ
Согласно expat.h, вы должны вызывать XML_StopParser(parser, 0), когда вы сталкиваетесь с ошибкой в вашем обработчике, которая гарантирует прерывание анализа.
Затем XML_Parse вернет XML_FALSE. В этот момент вы можете вызвать обработку ошибок вашего приложения.