如何将Java例外列表映射到客户可见错误代码

时间:2017-07-07 01:02:51

标签: java exception exception-handling

我正在为2组件系统{前端,后端}设计Java异常处理机制。后端将通过对不同的错误条件使用异常类来生成异常。前端必须将这些异常类映射到客户可见的错误代码。这个Exception类列表可能非常大,并且可能会继续增加。将这些异常类映射到客户可见错误代码的最佳方法是什么?

我可以创建一个Map<Class, Integer> MAP_EX_CLASS_TO_ERROR_CODE并保持更新,但它是映射异常的正确/可扩展方式吗?

-------收到初始答案后编辑,见下面的评论----

我想表示类似的异常类型,或要求使用一个异常类进行类似处理的异常。对于例如UserExceptions可以是:

  • RESOURCE_NAME_TOO_LONG
  • RESOURCE_NOT_FOUND
  • RESOURCE_NOT_OWNED ...

InternalExceptions可以是:

  • SERVER_UNAVAILABLE
  • REQUEST_TIMEOUT ...

如果我为所有这些错误代码创建一个枚举,那么实现分组是否仍然有用?我想进行分组而不是为已检查的异常定义一个单独的类,因为每当我添加一行抛出一个与现有异常不同的已检查异常的新代码行时,它会强迫我注意异常的捕获。代码。

例如。

public enum ECodes {
     RESOURCE_NAME_TOO_LONG(/*number*/0, UserException.class),
     RESOURCE_NOT_FOUND(1, UserException.class),
     RESOURCE_NOT_OWNED(2, UserException.class),
     SERVER_UNAVAILABLE(3, InternalException.class),
     REQUEST_TIMEOUT(4, InternalException.class);

     // constructor and stuff
}

public class Prot1ExceptionMapper {
     static Map<Ecode, /*CustomerCode*/Integer> MAP_EX_CLASS_TO_ERROR_CODE = new HashMap<>(); 

     static {
         MAP_EX_CLASS_TO_ERROR_CODE.add(Ecode.RESOURCE_NAME_TOO_LONG, PROT1_CUSTOMER_CODE1);
         // Other mappings here
     }

     public static Integer map(Ecode ecode) {
         // Lookup ecode
     }
}

public class Prot2ExceptionMapper {
     static Map<Ecode, /*CustomerCode*/Integer> MAP_EX_CLASS_TO_ERROR_CODE = new HashMap<>(); 

     static {
         MAP_EX_CLASS_TO_ERROR_CODE.add(Ecode.RESOURCE_NAME_TOO_LONG, PROT2_CUSTOMER_CODE1);
         // Other mappings here
     }

     public static Integer map(Ecode ecode) {
         // Lookup ecode
     }
}

public class UserException extends Exception {
     public UserException(ECodes ecode, String message) {
         assert ecode.class == UserException.class;
     }
}

public class InternalException extends Exception {
     public InternalException(ECodes ecode, String message) {
       assert ecode.class == UserException.class;
     }
}

class DummyClass {
  public void doFirstJob() throws UserException {}
  public void doSecondJob() throws InternalException {}
}

class Protocol1MainClass {
   public static void main(final String[] args) {
      try {
         doFirstJob();
         doSecondJob();
      } catch (UserException e1) {
         // Do UserException specific stuff
         throw Prot1ExceptionMapper.map(e1);
      } catch (InternalException e2) {
         // Do InternalException specific stuff
         throw Prot1ExceptionMapper.map(e2);
      }

0 个答案:

没有答案