是否可以从自定义共享库中引发特定于应用程序的异常?

时间:2016-05-14 02:39:51

标签: java

我想要一个共享库来包装内部的异常,并将其作为特定于应用程序的异常重新抛出,以便那些无法处理它们。

我目前所拥有的是一个带有静态方法的库异常,该方法设置应用程序特定的异常类,我通过反射实例化,以防异常被抛出。

我的目标是让一个特定于应用程序的异常可以通过公共代码优雅地处理。

有更好的方法吗?

lib.LibExUtil.java

class LibExUtil {
  static Class<? extends RuntimeException> ex = RuntimeException.class;
  public static setAppEx(Class<? extends RuntimeException> ex) {
    this.ex = ex;
  }
  static RuntimeException wrap(Throwable t) {
    return (RuntimeException)ex
      .getDeclaredConstructor(new Class[] {Throwable.class}).newInstance(new Object[] {t})
  }
}

lib.SomeUtil.java

static void utilMethod() {
  try {
    // code with checked exception
  } catch (Exception ex) {
    throw LibExUtil.wrap(ex);
  }
}

myApp.MyAppEx.java

public class MyAppEx extends RuntimeException {
  MyAppEx(Throwable t) {super(t);}
}

myApp.Client.java

// initialization
LibExUtil.setAppEx(myApp.MyAppEx.class);  // optional

void method() {
  SomeUtil.utilMethod();
}

2 个答案:

答案 0 :(得分:0)

为了可维护性,您通常希望避免在共享库中使用特定于应用程序的功能。

如果这是您的用例,抛出特定于库的异常并将其包装在应用程序级别会更有意义。

图书馆例外:

public class LibraryException extends Exception {
    LibraryException(Throwable t) {super(t);}
}

lib.SomeUtil.java

static void utilMethod() {
  try {
    // code with checked exception
  } catch (Exception ex) {
    throw new LibraryException(ex);
  }
}

myApp.Client.java

void method() {
  try{
    SomeUtil.utilMethod();
  } catch (LibraryException e) {
    throw new MyAppEx(e);
  }
}

答案 1 :(得分:0)

在您的示例中,您的库方法SomeUtil.utilMethod();做了一些工作,导致了一个例外。 util方法通过一些库定义的异常会更好地提醒用户它出了什么问题。

另一个问题是在多项目设置如maven的情况下,如果一个模块想要抛出一个不同的异常,那么其他模块和开发人员忘记调用静态方法,那么你的库方法会抛出一些误导性的异常。避免这种模式。