Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Possible bug when injecting exception into while loop



Nigel,

I think you've found a bug so please report it (along with the testcase
below) on Bugzilla. We seem to get confused by the "break;". BTW JAD (a
decompiler) also gets confused.

Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester,  SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/

Nigel_Charman@xxxxxxxxxxx@eclipse.org on 04/11/2004 03:50:44

Please respond to aspectj-users@xxxxxxxxxxx

Sent by:    aspectj-users-admin@xxxxxxxxxxx


To:    aspectj-users@xxxxxxxxxxx
cc:
Subject:    [aspectj-users] Possible bug when injecting exception into
       while loop



In order to test exception scenarios in an existing framework, I have
created an aspect to inject an exception.  The exception is injected into
some code running within a try/catch/finally block.  After the exception is
thrown, I am expecting control to pass to the catch block.  However, what
is happening is that the catch block code is not executed, control passes
through the finally block and the (undeclared) exception is thrown to the
calling method.

Here is a distilled test case:

public class MainClass {

        protected Integer counter;
        private int j;

        public static void main(String[] args) {

                MainClass mh = new MainClass();
                try {
                        mh.doSomething();
                } catch (Exception e) {
                        System.out.println("Exception thrown by
doSomething!!!!!");
                        e.printStackTrace();
                }
        }

        public void doSomething() {
                int i = 0;
                while (i++ < 1) {
                        counter=null;

                        try {
                                counter = getCounter();
                                if (counter == null) {
                                        break;
                                }

                                commit();
                        } catch (Throwable e) {
                                System.out.println("Caught exception " +
e);
                        } finally {
                                System.out.println("In finally block");
                        }
                }
        }

        protected Integer getCounter() {
                return new Integer(j++);
        }

        protected void commit() throws SQLException {
                System.out.println("Main.commit");
        }
}

The following aspect injects the exception:

public aspect SimpleExceptionThrowingAspect {

    pointcut commitOperation() : call (* MainClass+.commit(..));

    before() throws SQLException : commitOperation() {
         throw new SQLException("Dummy SQL Exception", "55102");
    }
}

Expected output is:
        Caught exception java.sql.SQLException: Dummy SQL Exception
        In finally block

Actual output is:
        In finally block
        Exception thrown by doSomething!!!!!
        java.sql.SQLException: Dummy SQL Exception        at
nz.govt.moh.test.SimpleExceptionThrowingAspect.ajc$before$nz_govt_moh_test_SimpleExceptionThrowingAspect$1$292c82f1(SimpleExceptionThrowingAspect.aj:10)

        at nz.govt.moh.test.MainClass.doSomething(MainClass.java:32)
        at nz.govt.moh.test.MainClass.main(MainClass.java:14)


Removing the "break;" statement from MainClass.java causes the expected
output to be produced.

I have tried this with no success on both AspectJ 1.2.0 and 1.2.1rc1.

I can't find any matching AspectJ bug reports.

Am I doing something wrong here?

Thanks
Nigel


*************************************************************************************

Statement of confidentiality: This e-mail message and any accompanying
attachments may contain information that is C0NFIDENTIAL and subject to
legal privilege.
If you are not the intended recipient, do not read, use, disseminate,
distribute or copy this message or attachments.
If you have received this message in error, please notify the sender
immediately and delete this message.
*************************************************************************************



Back to the top