/ / obsługa wyjątków expat - c ++, parser expat

expat obsługa wyjątków - c ++, expat-parser

Starałem się zrozumieć, dlaczegowyjątki zgłaszane przez moduł obsługi zdarzeń StartElement nie są wychwytywane przez moją aplikację, która korzysta z parsera expat (w C). Aplikacja kończy się, mówiąc, że nie może znaleźć bloków przechwytywania, chociaż mam wszystkie bloki przechwytywania na miejscu. Po prostu wyjątki są zgłaszane przez moje własne moduły obsługi zdarzeń, XML_Parse API programu expat nie jest w stanie przekazać go do mojego kodu, w którym mam wszystkie bloki catch. Jeden z użytkowników stackoverflow o nazwie „Michael Anderson” zasugerował przebudowę biblioteki expat lib z niezbędnymi flagami gcc, aby wyjątki obsługiwały bibliotekę expat lib. Czy ktoś może mi powiedzieć, jakie to flagi? Lub Zasugeruj lepsze wyjście z obsługi błędów w modułach obsługi zdarzeń, takich jak startelement, endelement itp.

W jakiś sposób chcę, aby interfejs API XML_Parse zwrócił 0, jeśli napotkam jakiś wyjątek w moich zarejestrowanych programach obsługi zdarzeń. Proszę pomóż. Z góry dziękuję.

Oto kod:

try
{
if( ! XML_Parse(.....) )
{
throw exception;
}
}
catch(...)
{
}

W scenariuszu roboczym, jeśli wystąpi XML_Parseźle sformatowany plik xml, natychmiast zwraca zero, a ja wchodzę do bloku if i rzucam wyjątek, i jest w porządku. Ale w problematycznym przypadku wyjątki są zgłaszane przez procedury obsługi zdarzeń, ale moja aplikacja zrzuca rdzeń, a stos rdzeni mówi, że nie może znaleźć catch i w końcu wywołać std :: terminate i abort. Jak sprawić, aby XML_Parse zwrócił zero, gdy chcę wyrzucić wyjątek zdefiniowany przez użytkownika z procedur obsługi zdarzeń?

Odpowiedzi:

0 dla odpowiedzi № 1

Zgodnie z expat.h powinieneś wywołać XML_StopParser (parser, 0), gdy napotkasz błąd w module obsługi, który uzasadnia przerwanie analizy.

XML_Parse zwróci wtedy XML_FALSE. W tym momencie możesz wywołać specyficzną dla aplikacji obsługę błędów