假设我有一个抛出某种Exception的方法。引发异常的代码位于访问外部服务的第三方库中。我有一些课程可以很好地处理外部服务,并且有很多异常处理程序可以处理潜在的问题。我遇到的问题是我可能有很多异常,但是如果有一个动作,并且可能有很多尝试/捕获块,我可能只需要执行几个动作之一。异常的类型甚至可能不相关,或者不同的方法可能会抛出相同类型的异常,但是根据抛出该异常的方法,需要采取不同的操作。
我正在寻找的是一种注释,它可以取代try / catch并仅指示该方法中存在异常时要采取的行为。我知道Spring ApsectJ可以做这种事情,但是我目前无法轻松添加任何新的依赖项或修改pom以调整现有的依赖项。因此,我希望可以通过自定义注释来实现。例如:
@Catcher(action=SomeEnum.SOME_ACTION)
public void doSomething(ServiceObj obj) throws SomeException {
ExternalService.makeThingsHappen(obj);
}
我当然会假设一个单独的类将处理异常。另一个困难是,我也需要传递ServiceObj。如果makeThingsHappen()失败,则可能需要obj来执行其他操作。动作变量将告诉处理程序类如何处理obj。
可以在没有严重污秽的情况下完成此操作,还是我希望找到一些可能不存在的东西?
这应该是一个低层的过程,并不意味着我们不能与当前层有相同的事物,但是它可能需要一堆代码,并且会使系统变得有点复杂。但是我的建议是这样的(我希望我做对了),首先为想要处理异常的人定义一个接口,像这样。
interface ExceptionHandler{
void handleException(Throwable t);
}
然后为user(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
接口,并使用注释在一个类中声明一个以上的方法,该方法需要大量额外的代码。我希望我能帮上忙。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句