Anmerkungen zur Ausnahmebehandlung verwenden?

8

Nehmen wir an, ich habe eine Methode, die eine Ausnahme auslöst. Der Exception-throwing-Code liegt in einer Drittanbieterbibliothek, die auf einen externen Dienst zugreift. Ich habe ein paar Klassen, die eine Menge Arbeit mit externen Diensten machen, und es gibt eine Vielzahl von Ausnahmen, um Probleme zu lösen. Das Problem, das ich treffe, ist, dass ich viele Ausnahmen haben kann, aber ich muss vielleicht nur eine der wenigen Aktionen ausführen, wenn es eine gibt, und es gibt eine Tonne von Versuchen / Catch-Blöcken, die gespickt sind. Der Typ der Ausnahme ist möglicherweise nicht einmal relevant, oder verschiedene Methoden können den gleichen Typ von Ausnahme auslösen, aber abhängig von der Methode, die sie auslöst, müssen andere Aktionen ausgeführt werden.

Was ich suche, ist eine Annotation, die try / catch ersetzen und das Verhalten diktieren kann, wenn in dieser Methode eine Ausnahme vorliegt. Ich weiß, dass Spring ApsectJ so etwas tun kann, aber ich bin derzeit nicht in der Lage, einfach neue Abhängigkeiten hinzuzufügen oder den Pom zu modifizieren, um bestehende anzupassen. Daher hoffe ich, dass dies mit einer benutzerdefinierten Anmerkung erreicht werden kann. Zum Beispiel:

%Vor%

Ich würde annehmen, dass eine separate Klasse natürlich Ausnahmen behandeln würde. Eine zusätzliche Schwierigkeit ist, dass ich das ServiceObj, das auch übergeben wird, benötigen würde. Wenn makeThingsHappen () fehlschlägt, muss obj möglicherweise weitere Aktionen ausführen. Die Aktionsvariable teilt der Handler-Klasse mit, was mit obj geschehen soll.

Kann dies ohne schwere Missgunst geschehen, oder hoffe ich auf etwas, das vielleicht nicht existiert?

    
user1017413 15.10.2013, 19:50
quelle

2 Antworten

17

Dies sollte ein Low-Level-Prozess sein, und es bedeutet nicht, dass wir nicht dasselbe mit dem aktuellen Level haben können, aber es braucht möglicherweise eine Menge Code und würde das System ein wenig komplex machen. Wie auch immer, mein Vorschlag wäre so (ich hoffe, ich habe es richtig verstanden), definiere zuerst eine Schnittstelle für diejenigen, die Ausnahmen verarbeiten wollen, so etwas.

%Vor%

dann eine Annotation für den Benutzer (API) zur Verfügung stellen, um seine Methoden zu markieren, kann eine Ausnahme auslösen.

%Vor%

Als nächstes brauchen wir eine Schnittstelle, um die Methode aufzurufen, die eine Exception auslösen kann, etwa so.

%Vor%

Dann brauchst du einen Typen, der sich um den Ablauf der Ausführung kümmert und den möglichen Ausnahmebehandler aufruft

%Vor%

und schließlich, lassen Sie uns ein Beispiel, es funktioniert sehr gut für mich, es ist cool. der Ausnahmebehandler.

%Vor%

und die Methode Anrufer.

%Vor%

Wie Sie sehen, muss der Benutzer die Methoden mit der Methode callmethod() aufrufen, Sie müssen auch die Schnittstelle Caller weglassen und Annotation verwenden, um mehr als eine Methode in einer Klasse zu deklarieren Codez. Ich hoffe, ich könnte etwas geben.

    
user2511414 15.10.2013, 21:38
quelle
2

Danke für die Hilfe, alles. Ich habe mir Spring AOP angesehen, habe mich aber letztendlich dagegen entschieden. Ich habe versucht, try / catch-Blöcke zu verwenden, aber einen Handler zu erstellen, der in jede Klasse injiziert wird und alle ausgelösten Ausnahmen in meine eigene Ausnahmeklasse einfügt und diese dann an den Handler in einer einzigen Zeile weitergibt. Es ist ein bisschen ähnlich dem Vorschlag von user2511414, dass es einen dedizierten Handler gibt, aber ich habe die Annotationen aufgegeben. Ich habe eine gute Anzahl von Try / Catch-Blöcken, aber zumindest habe ich den Großteil der Handling-Logik ausgehalten. Eine schnelle Zusammenfassung meiner Lösung für den Fall, dass andere Leute dies finden, was ein wenig verschleiert ist, aber Sie können immer noch den Punkt verstehen:

%Vor%

Implementieren Sie dann den IExceptionHandler mit einer konkreten Klasse, die MyException übernimmt, die zusätzlichen Daten ausliest und darauf basierende Aktionen ausführt. Dann kann jeder Block, der eine solche Ausnahme auslösen könnte, wie folgt gefangen werden:

%Vor%

Nun sind die meisten Details im Handler eingekapselt und die try / catch-Blöcke sind minimal. Der Handler kann den Stack-Trace der ursprünglichen Exception protokollieren, möglicherweise andere darauf basierende Aktionen ausführen und dann auf der Basis der Enumeration eigene Aktionen ausführen. Vielleicht ist es nicht die perfekte Lösung, aber es funktioniert hier gut genug.

    
user1017413 29.10.2013 21:32
quelle