Wie re-throw-exception in AspectJ rund um beraten
Habe ich einige Methoden, die wirft einige Ausnahme, und ich will AspectJ um zu beraten, um die Berechnung der Ausführungszeit und wenn einige exception geworfen wird und auf log-in Fehler-log und weiterhin den Fluss durch erneutes auslösen der exception.
Habe ich versucht dies zu erreichen durch folgende aber eclipse sagt "Unbehandelte Ausnahme-Typ".
Code-gegen wen aspectj wird verwendet :-
public interface Iface {
public void reload() throws TException;
public TUser getUserFromUserId(int userId, String serverId) throws ResumeNotFoundException, TException;
public TUser getUserFromUsername(String username, String serverId) throws ResumeNotFoundException, TException;
public TResume getPartialActiveProfileFromUserId(int userId, int sectionsBitField, String serverId) throws ResumeNotFoundException, UserNotFoundException;
public TResume getPartialActiveProfileFromUsername(String username, int sectionsBitField, String serverId) throws ResumeNotFoundException, UserNotFoundException, TException;
}
Aspectj-Code :-
public aspect AspectServerLog {
public static final Logger ERR_LOG = LoggerFactory.getLogger("error");
Object around() : call (* com.abc.Iface.* (..)) {
Object ret;
Throwable ex = null;
StopWatch watch = new Slf4JStopWatch();
try {
ret = proceed();
}catch (UserNotFoundException e) {
ex = e ;
throw e ;
} catch (ResumeNotFoundException e) {
ex = e ;
throw e ;
} catch (Throwable e) {
ex = e ;
throw new RuntimeException(e);
}finally{
watch.stop(thisJoinPoint.toShortString());
if(ex!=null){
StringBuilder mesg = new StringBuilder("Exception in ");
mesg.append(thisJoinPoint.toShortString()).append('(');
for(Object o : thisJoinPoint.getArgs()) {
mesg.append(o).append(',');
}
mesg.append(')');
ERR_LOG.error(mesg.toString(), ex);
numEx++;
}
}
return ret;
}
}
Bitte helfen warum das AspectJ nicht funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie vermeiden, fangen die Ausnahmen und nur mit einem try/finally-block ohne catch.
Und wenn Sie wirklich brauchen, um sich der Ausnahme, die Sie verwenden können, eine nach dem werfen Ratschläge, wie diese:
Fürchte ich, dass Sie nicht schreiben kann, Ratschläge zu werfen Ausnahmen, die nicht deklariert werden geworfen auf die übereinstimmenden join-point. Pro: http://www.eclipse.org/aspectj/doc/released/progguide/semantics-advice.html :
"Eine Beratung, die Erklärung muss eine throws-Klausel auflisten, die checked exceptions kann der Körper zu werfen. Diese Liste der geprüften Ausnahmen müssen kompatibel sein mit jeder Ziel-Punkt Verknüpfung der Beratung, oder ein Fehler wird signalisiert durch den compiler".
Dort hat gewesen Diskussion über die aspectj-mailing-Liste über die Verbesserung dieser situation - siehe threads wie diesen: http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg01412.html
aber im Grunde, was Sie tun müssen, ist eine andere Beratung für jede Variante der exception-Deklaration. Zum Beispiel:
dass beraten wird überall, wo sich jene 3 Ausnahmen.
Gibt es einen "hässlichen" workaround - ich fand Sie in Spring4
AbstractTransactionAspect