2013-09-04 7 views
6

Ich lerne ANTLR4 und ich habe keine vorherige Erfahrung mit Parser-Generatoren.Geprüfte Ausnahmen in Besucher

Wenn ich meine eigene Besucherimplementierung definiere, muss ich die Methoden des BaseVisitor überschreiben (ich suche zum Beispiel nach der EvalVisitor-Klasse unter page 40 of the book). Falls meine Methodenimplementierung möglicherweise eine Ausnahme auslöst, was soll ich tun? Ich kann eine geprüfte Ausnahme nicht verwenden, da die ursprüngliche Methode eine leere throws-Klausel hat. Soll ich ungeprüfte Ausnahmen verwenden? (Das scheint ein schlechtes Java-Design zu sein). Angenommen, in der EvalVisitor-Klasse möchte ich mit der Methode visitId (Seite 41) eine benutzerdefinierte Ausnahme, nämlich UndefinedId, zurückgeben, anstatt 0 zurückzugeben. Wie soll ich meinen Code schreiben?

+0

"Das Buch?" Könnten Sie einen Link oder zumindest einen Titel angeben? – vroomfondel

+0

@rogaos, guter Punkt, aber in diesem Fall gibt es nur eine Möglichkeit (die ich in der Frage bearbeitet). –

Antwort

4

Sie haben zwei Möglichkeiten:

  1. die Ausnahme innerhalb des Besuchers Methode selbst Griff.
  2. Umhüllen Sie Ihre geprüfte Ausnahme in einer nicht aktivierten Ausnahme. Eine Möglichkeit ist ParseCancellationException, aber Sie müssen für sich selbst entscheiden, ob das in Ihrer Anwendung sinnvoll ist.

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

Hmm, der Punkt ist, dass meine Besuchsmethode * eine throws-Klausel in ihrer Schnittstelle haben sollte. Im Beispiel der EvalVisitor-Klasse wäre es beispielsweise sinnvoll, folgende Signatur für die visit-Methoden zu haben: public Integer visit _ (...) löst UndefinedId aus, was bedeutet, dass der Aufruf eine Ausnahme auslöst, wenn ein Bezeichner gefunden wird, der vorher nicht vergeben. Es scheint, dass dies nicht durch die Wiederverwendung von ANTLR-Code erreicht werden kann und dass stattdessen deaktivierte Exceptions verwendet werden sollten, aber sie sind für einen Client weniger informativ. –

+0

Sie können Ihren Code im richtigen Java-Stil schreiben, indem Sie Ihre Besucherimplementierung so schreiben, dass die Ausnahme "UndefinedId" niemals ausgelöst wird. Eine Möglichkeit besteht darin, einen separaten Besucher zu verwenden, um Informationen über Definitionen zu sammeln und dann eine Ausnahme (außerhalb des Besuchercodes) auszulösen, wenn das Ergebnis dieses Besuchers andeutet, dass etwas nicht definiert ist. Zu dem Zeitpunkt, zu dem Sie in dem oben beschriebenen Besucher arbeiten, werden alle Elemente definiert und die "throws" -Klausel wird überflüssig. –

+1

Ich denke, wenn Sie einen anderen Besucher haben, ändert sich das Problem nicht. Stattdessen schlagen Sie vor, den undefinierten Fall als zusätzlichen Rückgabewert und nicht als Ausnahme zu modellieren. Das heißt, die visit-Methode hat die Signatur public Integer_Or_Undefined visit _ (...). Dies ist eine mögliche und saubere Lösung, aber Sie verlieren natürlich den Vorteil der automatischen Fehlerfortpflanzung. –

Verwandte Themen