Сначала вам нужно упаковать IOException в непроверенное исключение, реальное исключение будет причиной исключения, которое вы поймаете в совете.
Самый простой — взять RuntimeException.
public void doTimerJob() {
final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
throw new IOException("file not found");
} catch (IOException e) {
timer.cancel();
throw new RuntimeException(e);
}
}
}, new Date(), 2000);
}
Тогда вы можете попробовать следующее:
Создайте точечный разрез для TimerTask#run
pointcut timerTaskRun() : execution(public * java.util.TimerTask.run(..) );
и совет после создания исключения RuntimeException
after() throwing(RuntimeExceptione) : timerTaskRun() {
System.out.println("log and rethrow " + e.getCause().getMessage());
}
Это повторно вызовет исключение после его регистрации.
Если вы хотите зарегистрировать и проглотить исключение, вы можете написать совет вокруг
Object around() : timerTaskRun() {
Object o;
try {
o = proceed();
} catch(RuntimeException e) {
System.out.println("log and swallow " + e.getCause().getMessage());
o = null;
}
return o;
}
Обратите внимание, что у вас должен быть только один из советов, либо after throwing
, либо around
, а не оба.
Но вы можете не захотеть советовать все вызовы TimerTask#run
вместе со всеми RuntimeException
. В этом случае вы должны создать собственные типы, которые вы должны использовать в точечном разрезе и советах.
"Непроверенный" IOException
public class IOExceptionUnchecked extends RuntimeException {
private static final long serialVersionUID = 1L;
public IOExceptionUnchecked(IOException e) {
super(e);
}
}
Пользовательская задача таймера
public class MyTimerTask extends TimerTask {
Timer owner = null;
public MyTimerTask(Timer timer) {this.owner = timer;}
@Override
public void run() {
try {
throw new IOException("file not found");
} catch (IOException e) {
owner.cancel();
throw new IOExceptionUnchecked(e);
}
}
}
Точечный разрез
pointcut timerTaskRun() : execution(public * com.example.MyTimerTask.run(..) );
после брошенного совета:
after() throwing(IOExceptionUnchecked e) : timerTaskRun() {
System.out.println("log and rethrow " + e.getCause().getMessage());
}
Или совет
Object around() : timerTaskRun() {
Object o;
try {
o = proceed();
} catch(IOExceptionUnchecked e) {
System.out.println("log and swallow " + e.getCause().getMessage());
o = null;
}
return o;
}
person
A4L
schedule
14.11.2013