如何处理应该有很多例外的情况?

时间:2018-07-04 03:01:42

标签: java exception-handling

我不得不使用反射来实例化一组类。一切都很好,但是反射使用了许多异常,我的方法看起来很丑。

在这些情况下,良好做法有什么建议?

应该将这些异常抛出并捕获到高级类中,以便能够提供有关错误的明确信息,但是如果我要在所有涉及的方法和类中经历6或8个异常,则代码将会非常恐怖,混乱而且非常恐怖。

private Filter getFilterInstance(String path){
    try {
        return (Filter) Class.forName(path).getConstructor().newInstance();
    } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
        Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

4 个答案:

答案 0 :(得分:1)

您可以抓住ReflectiveOperationException

这是以下内容的超级类型:

  • ClassNotFoundException
  • IllegalAccessException
  • InstantiationException
  • InvocationTargetException
  • NoSuchFieldException
  • NoSuchMethodException

这意味着您只需要:

} catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
    Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
    return null;
}

由于SecurityExceptionIllegalArgumentException实际上是运行时异常,因此您可以:

} catch (ReflectiveOperationException ex) {
    Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
    return null;
}

如果您可以接受RuntimeException向呼叫者传播的话,请确定。

答案 1 :(得分:0)

最好的方法是分别处理它们。
原因

..
catch(Exception1 | Exception2 ex)
  1. 检查哪个异常发生,然后编写处理该异常的方法将成为一项开销。

      

    为什么要添加不必要的if语句来检查发生了哪个异常?

  2. 简单来说,您的代码变得不可读。

答案 2 :(得分:0)

许多人声称检查和未检查异常之间的战争已经结束。

未选中的赢了!

所以简单的答案是:在最低级别上用一个简单的Exception捕获来包围代码,然后将该异常放入(可能是专门的)RuntimeException中,然后将其重新抛出。

然后,在需要它的更高层上,捕获包装异常,访问其原因并进行适当处理。哪里:您在这里看到的几乎所有不同的已检查异常很可能类似于内部错误。因此,最初没有太多“不同的错误消息”。

答案 3 :(得分:0)

如果每种异常类型需要不同的处理逻辑,请使用单独的catch块。

如果其中几个需要相同的处理逻辑,则将这些捕获在同一块中。

如果所有可能的异常都需要相同的处理逻辑,请捕获基本的Exception类型。这看起来像是代码的正确解决方案,因为无论它们是哪种类型,您都将它们传递到记录器中。

private Filter getFilterInstance(String path){
    try {
        return (Filter) Class.forName(path).getConstructor().newInstance();
    } catch (Exception ex) {
        Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}