[ Pobierz całość w formacie PDF ]
.Procedury obsługi błędówOprócz interfejsu ContentHandler, SAX udostępnia również interfejs ErrorHandler, służący do obsługi sytuacji awaryjnych zaistniałych w czasie przetwarzania.Klasa ta działa podobnie jak omówiona wcześniej procedura obsługi dokumentu, ale zdefiniowano w niej jedynie trzy wywołania wsteczne.Przy pomocy tych trzech metod SAX obsługuje i powiadamia o wszystkich możliwych błędach.Każda metoda otrzymuje informacje o błędzie lub ostrzeżeniu poprzez klasę SAXParseException.Obiekt ten zawiera numer wiersza, w którym wystąpił błąd, identyfikator URI przetwarzanego dokumentu (dokument przetwarzany lub zewnętrzne odwołanie wewnątrz tego dokumentu) oraz zwykłe informacje o błędzie, takie jak komunikat i dane ze śledzenia stosu.Ponadto każda metoda może zgłosić SAXException.Na początku może się to wydawać nieco dziwne — program obsługi wyjątków zgłaszający wyjątek? Należy jednak pamiętać, że każda z procedur obsługi błędów otrzymuje wyjątki związane z przetwarzaniem.Może to być ostrzeżenie, które nie powinno przerwać procesu przetwarzania, lub błąd, który należy rozwiązać, aby to przetwarzanie mogło być kontynuowane.Jednak wywołanie takie może także wykonywać operacje wejścia-wyjścia lub inne, które mogą spowodować zgłoszenie wyjątku — i wyjątek ten należy przekazać aż „na samą górę”, do aplikacji.Służy do tego właśnie wyjątek SAXException.Załóżmy, że procedura obsługi błędów otrzymuje powiadomienia o błędzie i zapisuje je do pliku dziennika błędów.Metoda taka musi być w stanie albo dopisać informacje do pliku istniejącego, albo stworzyć nowy plik.Gdyby w czasie przetwarzania dokumentu XML wystąpiło ostrzeżenie, także „dowiadywałaby” się o nim ta metoda.Ostrzeżenie miałoby na celu wywołanie odpowiedniej procedury i nie przerywałoby przetwarzania.Jednakże, jeśli procedura obsługi błędów nie byłaby w stanie zapisywać do pliku dziennika, musiałaby zakomunikować parserowi i aplikacji, że przetwarzanie ma zostać przerwane.Efekt taki można uzyskać poprzez przechwycenie wszystkich wyjątków wejścia-wyjścia i ponowne zgłoszenie ich aplikacji wywołującej, powodując przerwanie przetwarzania.Powyższy przykład wyjaśnia, dlaczego procedury obsługi błędów muszą mieć możliwość zgłaszania wyjątków (patrz przykład 3.3).Przykład 3.3.Procedura obsługi, która może zgłosić SAXExceptionpublic void warning(SAXParseException exception)throws SAXException {try {FileWriter fw = new FileWriter("error.log");BufferedWriter bw = new BufferedWriter(fw);bw.write("Ostrzeżenie: " + exception.getMessage() + "\n");bw.flush();bw.close();fw.close();} catch (Exception e) {throws new SAXException("Brak możliwości zapisu do pliku dziennika", e);}}Teraz można już zdefiniować szkielet procedury obsługi błędów i zarejestrować ją w parserze w taki sam sposób, jak w przypadku procedury obsługi zawartości.Najpierw trzeba zaimportować klasę SAXParseException i ErrorHandler:import java.io.IOException;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.ErrorHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;import org.xml.sax.SAXParseException;import org.xml.sax.XMLReader;Teraz w tym samym pliku z programem w Javie (znów na dole, po klasie MyContentHandler) należy zaimplementować interfejs ErrorHandler, zdefiniowany w ramach SAX-a.Podobnie jak przy omawianiu klasy ContentHandler, poniżej są przedstawione puste implementacje, które wkrótce zostaną wypełnione treścią:/*** <b><code>MyErrorHandler</code></b> implementuje interfejs SAX* <code>ErrorHandler</code> i definiuje zachowanie wywołań* wstecznych powiązanych z błędami w XML-u.*/class MyErrorHandler implements ErrorHandler {/*** <p>* Powiadomienie o ostrzeżeniu; żadne zasady XML nie zostały "złamane",* ale wydaje się, że czegoś brakuje lub coś jest wpisane niepoprawnie.* </p>** @param exception <code>SAXParseException</code> -- wyjątek, jaki nastąpił.* @throws <code>SAXException</code> gdy coś pójdzie nie tak.*/public void warning(SAXParseException exception)throws SAXException {}/*** <p>* Tutaj komunikujemy o błędzie, jeśli taki się pojawi; błąd oznacza, że* złamano regułę i zazwyczaj pojawia się w czasie sprawdzania składni;* przetwarzanie może jeszcze być kontynuowane
[ Pobierz całość w formacie PDF ]