2013-06-15 10 views
5

Sto scrivendo un aspetto non primaverile usando aspectJ e sto scrivendo prima un consiglio per questo.Puoi lanciare un'eccezione da un AspectJ grezzo Prima di dare un consiglio

Nel mio precedente consiglio, diciamo che voglio aprire un file. Così ho eseguito come tale:

public before(): mypointcut() { 
    File file = new File("myfile"); 
    file.getCanonicalPath(); 
} 

Ma IntelliJ lamentele circa IOException essere un'eccezione non gestita. Come posso scrivere il parere precedente in modo che possa intercettare e rilanciare l'eccezione o consentire l'eccezione non gestita?

risposta

2

Al fine di consegnare l'eccezione lo stack di chiamate è necessario aggiungere un tiri dichiarazione il tuo consiglio, proprio come con una normale chiamata di metodo:

public before() throws IOException: mypointcut() {...} 

Questo consiglio può essere applicato solo su metodi che dichiarano lancio questo eccezione (o un genitore dell'eccezione) stessi.

Per rigenerare lo devi prendere l'eccezione e rigenerare in un'istanza di RuntimeException in questo modo:

public before(): mypointcut() { 
    File file = new File("myfile"); 
    try { 
     file.getCanonicalPath(); 
    } catch (IOException ex) { 
     throw new RuntimeException(e); 
    } 
} 

Se questa è una buona idea è un altro discorso ...

+0

I vedi dov'era la mia confusione Ho letto solo di recente (http://www.eclipse.org/aspectj/doc/next/progguide/semantics-advice.html) che gli Advices possono solo generare alcuni tipi di eccezioni: Runtime è uno di questi. Quindi hai ragione, se ottengo un'eccezione, ho bisogno di avvolgerla in un'eccezione di "consiglio lanciabile". – Eric