2013-09-04 11 views
6

Uczę się ANTLR4 i nie mam wcześniejszych doświadczeń z generatorami analizatorów składni.Sprawdzane wyjątki od odwiedzających

Kiedy definiuję implementację mojego gościa, muszę nadpisać metody BaseVisitora (szukam przykładu na klasie EvalVisitor pod numerem page 40 of the book). Jeśli moja implementacja metody prawdopodobnie zgłasza wyjątek, co powinienem zrobić? Nie mogę użyć sprawdzonego wyjątku, ponieważ oryginalna metoda ma pustą klauzulę throws. Czy mam używać niezaznaczonych wyjątków? (wydaje się to złym projektem Java). Załóżmy na przykład, że w klasie EvalVisitor chcę metodę visitId (strona 41), aby rzucić zdefiniowany przez użytkownika wyjątek, na przykład UndefinedId, zamiast zwracać 0. Jak powinienem napisać mój kod?

+0

"książki?" Czy możesz podać link lub przynajmniej tytuł? – vroomfondel

+0

@rogaos, dobra uwaga, ale w tym przypadku istnieje tylko jedna możliwość (którą zredagowałem w pytaniu). –

Odpowiedz

4

Masz dwie opcje:

  1. obsłużyć wyjątek wewnątrz samego sposobu zwiedzających.
  2. Zawijanie zaznaczonego wyjątku w niezaznaczonym wyjątku. Jedną z możliwości jest ParseCancellationException, ale musisz sam ustalić, czy ma to sens w Twojej aplikacji.

    try { 
        ... 
    } catch (IOException ex) { 
        throw new ParseCancellationException(ex); 
    } 
    
+0

Hmm chodzi o to, że moja metoda odwiedzin * powinna * mieć klauzulę throws w interfejsie. Na przykład w przykładzie klasy EvalVisitor warto mieć następujący podpis dla metod odwiedzin: publiczny Integer visit _ (...) wyrzuca UndefinedId, co oznacza, że ​​odwiedziny zgłaszają wyjątek, jeśli napotkano jakiś identyfikator, który nie przypisano wcześniej. Wydaje się, że nie można tego uzyskać, ponownie wykorzystując kod ANTLR, i że zamiast tego należy używać niezaznaczonych wyjątków, ale są one mniej informatywne dla klienta. –

+0

Możesz napisać swój kod w odpowiednim stylu Java, pisząc implementację użytkownika w taki sposób, że wyjątek 'UndefinedId' nigdy nie zostanie zgłoszony. Jedną z możliwości jest użycie osobnego gościa do zbierania informacji o definicjach, a następnie wyrzucenie wyjątku (poza kodem odwiedzającego), jeśli wynik tego odwiedzającego sugeruje, że coś nie jest zdefiniowane. Do momentu, w którym działasz na stronie opisanej powyżej, wszystkie elementy są zdefiniowane, a klauzula "rzutów" staje się niepotrzebna. –

+1

Myślę, że posiadanie innego gościa nie zmienia problemu, a raczej sugeruje raczej model niezdefiniowanej wielkości jako dodatkowej wartości zwracanej niż wyjątku. Oznacza to, że metoda odwiedzin będzie zawierała publiczny publiczny Integer_Or_Nieokreśloną wizytę _ (...). Jest to możliwe i czyste rozwiązanie, ale oczywiście tracisz możliwość automatycznego propagowania błędów. –