[
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