当前位置: 首页 > 面试题库 >

使用注释进行异常处理?

包和泰
2023-03-14
问题内容

假设我有一个抛出某种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接口,并使用注释在一个类中声明一个以上的方法,该方法需要大量额外的代码。我希望我能帮上忙。



 类似资料:
  • 如何定制spring中注释的异常处理? 我有Cron作业,这些作业将在服务器(Tomcat 6)中触发,当出现任何异常时,我需要进行一些处理。 Spring版本3.2 Tomcat服务器6

  • 我是一个有Spring和Spring靴的新手。在创建了一个简单的REST API来对用户执行CRUD操作之后,我还创建了自定义的异常处理程序来捕获应用程序中发生的任何异常。这是我写的代码 controller类 使用@ControllerAdvice注释的异常处理程序类 但是,当发生任何异常时,应用程序将被重定向到/error page,而不是由异常处理程序类处理。谁能给出正确的方法来做这件事。

  • 我正在尝试使用spring Boot运行一个web应用程序。 将密码映射为硬编码值。 我的问题是:当应用程序运行并且在主类上使用注释时,只要它命中URL就会发生以下异常: javax.servlet.ServletException:在org.springframework.web.servlet.dispatcherservlet.render(dispatcherservlet.java:13

  • 我正在尝试进行大量的外部服务调用,每个调用都遵循异常处理和有条件的进一步处理。我认为使用内部的. on完成来扩展这个不错的(Scala中带有期货的异步IO)示例会很容易,但似乎我对范围和/或期货有些不理解。有人能给我指出正确的方向吗? 在我的电脑上(Scala 2.10.4 ),这打印出来: 我要(顺序不重要):

  • 我有一个SpringRest申请。我从controller抛出所有异常,并在一个公共位置处理它们,一个名为ExceptionHandlerControllerAdvision的类,用@ControllerAdvision注释。在这里,我有多个用@ExceptionHandler注释的方法来处理每种类型的异常。在这些方法中,我发送自定义错误json响应。在将此错误json发送给使用者之前,我会在日志

  • 我对Spring Boot配置有问题。 我已经使用https://start.spring.io/ 我有一个问题,配置只适用于子曲库中的类: 我尝试了annotation@ComponentScan,但没有任何帮助。 你知道我能用这个做什么吗?