Wrap-Ausnahmen durch Laufzeitausnahmen mit einer Annotation

8

Gibt es eine Möglichkeit, eine Methode zu kommentieren, so dass alle ausgelösten Ausnahmen automatisch in die Laufzeitausnahme konvertiert werden?

%Vor%     
ripper234 27.06.2009, 10:23
quelle

8 Antworten

1

Keine Möglichkeit, das zu tun, zumindest jetzt benutze ich eine solche Problemumgehung (vereinfacht):

%Vor%

Und die Verwendung sieht folgendermaßen aus:

%Vor%

Der Trick ist, dass die Schnittstelle "nie fertig ist" und jedes Mal, wenn ich irgendwo eine unkontrollierte Methode brauche, werde ich das Objekt in unchecked einbinden und IDE die Methodensignatur in der Schnittstelle erzeugen lassen.

Die Implementierung ist dann generisch (reflektierend und "langsam", aber normalerweise schnell genug)

Es gibt einige Code-Postprozessoren und Bytecode-Weber, aber das war nicht möglich (nicht einmal AOP oder andere jvm-basierte Sprache) für mein aktuelles Projekt, also wurde das "erfunden".

    
Kamil Tomšík 11.06.2012, 19:31
quelle
6

Projekt Lomboks @SneakyThrows ist wahrscheinlich das, wonach Sie suchen. Umschließt Ihre Exception nicht wirklich (weil es in vielen Fällen ein Problem sein kann), es wirft keinen Fehler während der Kompilierung.

%Vor%     
sinuhepop 30.11.2012 11:19
quelle
2

Sie können dies mit AspectJ tun. Sie deklarieren einen Joinpoint (in diesem Fall Aufruf der Methode foo) und "mildern" Sie die Exception.

Bearbeiten Um ein wenig dazu zu sagen:

Angenommen, Sie haben die folgende Klasse Bar :

%Vor%

... und du hast einen Test wie folgt:

%Vor%

Dann wird der Test offensichtlich nicht kompiliert. Es wird einen Fehler geben:

%Vor%

Um dies mit AspectJ zu überwinden, schreiben Sie einen sehr einfachen Aspekt: ​​

%Vor%

Der Aspekt besagt grundsätzlich, dass jeder Code innerhalb eines Tests (dh eine Methode, die mit "test" in einer Klasse beginnt, die mit "Test" endet und "void" zurückgibt), die eine Ausnahme auslöst, vom AspectJ akzeptiert wird Compiler. Wenn eine Ausnahme auftritt, wird sie vom Compiler AspectJ umschlossen und als RuntimeException geworfen.

Wenn Sie diesen Test als Teil eines AspectJ-Projekts innerhalb von Eclipse (mit installiertem AJDT) ausführen, ist der Test erfolgreich, während er ohne den Aspekt nicht einmal kompiliert wird.

    
Maarten Winkels 27.06.2009 10:45
quelle
1

Ich denke, es ist möglich mit Bytecode-Reengineering, kundenspezifischem Compiler oder vielleicht aspektorientierter Programmierung 1 . Im Gegensatz zu Java hat C # nur die Ausnahmen 2 .

Darf ich fragen, warum Sie die geprüften Ausnahmen unterdrücken möchten?

1 Nach Maarten Winkels ist das möglich.
2 und sie denken darüber nach, überprüfte einzuführen, so ein Kanal 9 Videos.

Bearbeiten: Für die Frage: Es ist in dem Sinne möglich, dass Sie Ihre Methoden mit Anmerkungen versehen können, um sie als Kandidaten für die Überprüfung der Ausnahmebedingung zu markieren. Dann verwenden Sie einen Kompilierzeit- oder Laufzeittrick, um die tatsächliche Unterdrückung / Umhüllung anzuwenden.

Da ich jedoch die Umgebung in Ihrem Fall nicht sehe, kann das Umbrechen einer Ausnahme auf diese Weise die Clients dieser Methode verwirren - sie sind möglicherweise nicht bereit, sich mit einer RuntimeException zu befassen. Beispiel: Die Methode löst eine IOException aus, und Ihre Clients fangen sie als FileNotFoundException ab, um einen Fehlerdialog anzuzeigen. Wenn Sie jedoch Ihre Exception in eine RuntimeException umbrechen, wird der Fehlerdialog nie angezeigt, und wahrscheinlich wird auch der Thread des Aufrufers beendet. (IMHO).

    
akarnokd 27.06.2009 10:46
quelle
1

Die aktivierten Ausnahmen sind Verantwortlichkeit der Methodenimplementierung. Gehen Sie sehr vorsichtig mit dieser Tatsache um. Wenn Sie keine Workaround-Artefakte wie diese verwenden können.

    
Luciano 10.05.2011 16:06
quelle
0

Sie können dies auf jeden Fall tun, indem Sie verwenden, dass Class.newInstance nicht ein Exception , das vom Konstruktor no-arg geworfen wird, in ein InvocationTargetException umschließt; Stattdessen wirft es es leise :

%Vor%

Dann können Sie dieses Dienstprogramm überall verwenden:

%Vor%

Übrigens ist das eine wirklich schlechte Idee :-)

    
oxbow_lakes 27.06.2009 13:32
quelle
0

Ich benutze das Komplettierungs- / Vorlagesystem von Eclipse, um jeden Codeblock einfach zu umbrechen.

Hier ist meine Vorlage:

%Vor%     
Raphael Jolivet 03.05.2011 09:37
quelle
-2

Mit Java 8 ist es so einfach wie: soften(() -> methodThatMayThrow())

Lesen Sie mehr unter Ссылка

    
iirekm 07.05.2014 16:27
quelle