How to re-throw exception in AspectJ around advise
aspectj, exception
Solution
you can avoid catching the exceptions and just use a try/finally block without the catch. And if you really need to log the exception you can use an after throwing advice, like this:
public aspect AspectServerLog {
public static final Logger ERR_LOG = LoggerFactory.getLogger("error");
Object around() : call (* com.abc.Iface.* (..)) {
StopWatch watch = new Slf4JStopWatch();
try {
return proceed();
} finally {
watch.stop(thisJoinPoint.toShortString());
}
}
after() throwing (Exception ex) : call (* com.abc.Iface.* (..)) {
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);
}
}
Problem
I have some methods which throws some exception, and I want to use AspectJ around advise to calculate the execution time and if some exception is thrown and to log into error log and continue the flow by re-throwing the exception. I tried to achieve this by following but eclipse says "Unhandled Exception type". Code-against whom AspectJ is to used :- ``` 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; } ``` Code AspectJ :- ``` 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; } } ``` Please help why this AspectJ is not working.