Search code examples
exceptionaspectj

How to re-throw exception in AspectJ around advise


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.


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);
        }
    
    }