Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Exception dilemma

Hi Thomas,

yes, that's exactly what I want - I tried your code and it works. I had a little problem to understand the code but I think the trick here is to use the constructor of the inner class to throw the desired exception.

What I don't understand is the $ sign before the method name ($throw) but I guess this is syntax for inner classes.

thanx for your tip
Oliver



Thomas Richard Darimont schrieb:
Hi Oliver,

so you want to throw an exception after some specific Methods return

How about this:
(Just a quick hack...)

Aspect:
[code]
package de.tutorials.training.aspects;

import java.io.IOException;

public aspect ExampleAspect {
pointcut applicationCode(): execution(* *..*(..)) && ! within(ExampleAspect);
  //    after() throwing(Throwable t) : applicationCode(){
//    }
     after() returning: applicationCode(){
       Thrower.$throw(new IOException("oh oh"));
   }
     static class Thrower{
       private static Throwable throwable;
             private Thrower() throws Throwable{
           throw throwable;
       }
             public static void $throw(Throwable t){
           throwable = t;
           try {
               Thrower.class.newInstance();
           } catch (InstantiationException e) {
               e.printStackTrace();
           } catch (IllegalAccessException e) {
               e.printStackTrace();
           }
       }
             public static void $throw0(Throwable t){
           //Questionable but okay for "debugging" purposes
           Thread.currentThread().stop(t);
       }
   }
}
[/code]

Example:
[code]
package de.tutorials.training;

public class Main {
   public static void main(String[] args) throws Throwable {
       try {
           m0();
       } catch (Throwable t) {
           t.printStackTrace();
       }
             try {
           m1();
       } catch (Throwable t) {
           t.printStackTrace();
       }

       try {
           m2();
       } catch (Throwable t) {
           t.printStackTrace();
       }
   }

   public static void m0() {}
   public static int m1() { return 0; }
   public static void m2() throws Throwable {}
}
[/code]

Output:
[code]
java.io.IOException: oh oh
at de.tutorials.training.aspects.ExampleAspect.ajc$afterReturning$de_tutorials_training_aspects_ExampleAspect$1$d15ea11e(ExampleAspect.aj:12)
   at de.tutorials.training.Main.m0(Main.java:29)
   at de.tutorials.training.Main.main(Main.java:10)
java.io.IOException: oh oh
at de.tutorials.training.aspects.ExampleAspect.ajc$afterReturning$de_tutorials_training_aspects_ExampleAspect$1$d15ea11e(ExampleAspect.aj:12)
   at de.tutorials.training.Main.m1(Main.java:32)
   at de.tutorials.training.Main.main(Main.java:15)
java.io.IOException: oh oh
at de.tutorials.training.aspects.ExampleAspect.ajc$afterReturning$de_tutorials_training_aspects_ExampleAspect$1$d15ea11e(ExampleAspect.aj:12)
   at de.tutorials.training.Main.m2(Main.java:37)
   at de.tutorials.training.Main.main(Main.java:20)
Exception in thread "main" java.io.IOException: oh oh
at de.tutorials.training.aspects.ExampleAspect.ajc$afterReturning$de_tutorials_training_aspects_ExampleAspect$1$d15ea11e(ExampleAspect.aj:12)
   at de.tutorials.training.Main.main(Main.java:25)

[/code]

Best regards,
Thomas

Oliver Böhm schrieb:
Hallo,

for testing purpose I want to throw an Exception after a method returns:

    after() returning throws InterruptedException : applicationCode() {
        throw new InterruptedException();
    }

This works as expected for methods which throws InterruptedException. Now I want to make it more general and addresses *all* methods which can throw an checked exception:

    after() returning throws Exception : applicationCode() {
        ...
    }

But here I got an error message ("can't throw checked exception 'java.lang.Exception' at this join point...") which is clear because the pointcut "applicationCode()" addresses e.g. an InterruptException.

Has anybody a hint or tip how I can realize it without defining an advice for each possible checked Exception?

regards
Oliver
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users

--
Oliver Böhm
http://www.javatux.de


Back to the top