为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

富国沪深 2021-05-01 14:10:04
我不得不使用反射来实例化一组类。一切都很好,但是反射使用了许多异常,而我的方法看起来很丑陋。在这些情况下,良好做法有什么建议?应该抛出这些异常并将其捕获到高级类中,以便能够提供有关错误的明确信息,但是如果我要在所有涉及的方法和类中经历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;    }}
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

你可以抓住 ReflectiveOperationException

它是以下类型的超级类型:

  • ClassNotFoundException

  • IllegalAccessException

  • InstantiationException

  • InvocationTargetException

  • NoSuchFieldException

  • NoSuchMethodException

这意味着您只需要:

} catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {

    Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);

    return null;

}

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


} catch (ReflectiveOperationException ex) {

    Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);

    return null;

}

如果您可以RuntimeException向来电者传播。


查看完整回答
反对 回复 2021-05-12
?
aluckdog

TA贡献1847条经验 获得超7个赞

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

未经检查的赢了!

因此,简单的答案是:在最低级别上用一个简单的Exception捕获来包围您的代码,将该异常放入(可能是专用的)RuntimeException并重新抛出该异常。

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



查看完整回答
反对 回复 2021-05-12
?
大话西游666

TA贡献1817条经验 获得超14个赞

如果每种异常类型都需要不同的处理逻辑,请使用单独的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;

    }

}


查看完整回答
反对 回复 2021-05-12
  • 3 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信