這應該是一個低級別的過程,並不意味着我們不能和當前級別有相同的事情,但它可能需要一堆代碼,並且會使系統複雜一點。 然而,我的建議會是這樣的(我希望我知道它是正確的),首先爲誰想要處理異常定義一個接口,就像這樣。
interface ExceptionHandler{
void handleException(Throwable t);
}
然後爲用戶(API)提供註釋以標記其方法可能拋出一些異常。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
@interface Catch{
public Class<? extends ExceptionHandler> targetCatchHandler();
public Class<? extends Throwable> targetException() default Exception.class;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface CatchGroup{
public Catch[] catchers();
}
接下來我們需要一個接口來開始調用可能拋出異常的方法,像這樣。
interface Caller{
void callMethod()throws Throwable;
}
,那麼你需要誰照顧和管理執行的流程,並調用可能異常處理程序
class MethodCaller{
/*
* @param isntance: instance which implemented the Caller interface
*/
public static void callMethod(Caller instance)
throws Exception {
Method m = instance.getClass().getMethod("callMethod");
Annotation as[] = m.getAnnotations();
Catch[] li = null;
for (Annotation a : as) {
if (a.annotationType().equals(CatchGroup.class)) {
li = ((CatchGroup) a).catchers();
}
// for(Catch cx:li){cx.targetException().getName();}
}
try {
instance.callMethod();
} catch (Throwable e) {
Class<?> ec = e.getClass();
if (li == null) {
return;
}
for (Catch cx : li) {
if (cx.targetException().equals(ec)) {
ExceptionHandler h = cx.targetCatchHandler().newInstance();
h.handleException(e);
break;
}
}
}
}
}
最後,讓我們有一些例子一個傢伙,它的工作對我非常好,這個很酷。 異常處理程序。
public class Bar implements ExceptionHandler{//the class who handles the exception
@Override
public void handleException(Throwable t) {
System.out.println("Ta Ta");
System.out.println(t.getMessage());
}
}
和方法調用者。
class Foo implements Caller{//the class who calls the method
@Override
@CatchGroup(catchers={
@Catch(targetCatchHandler=Bar.class,targetException=ArithmeticException.class),
@Catch(targetCatchHandler=Bar.class,targetException=NullPointerException.class)})
public void callMethod()throws Throwable {
int a=0,b=10;
System.out.println(b/a);
}
public static void main(String[] args) throws Exception {
Foo foo=new Foo();
MethodCaller.callMethod(foo);
}
}
正如你看到的,用戶必須調用由callmethod()
方法的方法,您也將省略Caller
接口,並使用註解,因爲它需要大量額外的一類聲明的方法不止一種codez。 我希望我可以舉手。
註釋不會自行添加行爲。他們是元數據。你需要爲它們提供一個解析器,如果它發現它們就可以添加該行爲。 –
我會稱之爲輕微泥濘;它可以通過AOP或一些字節碼操作來處理。 –