我正在使用反射将一些数据添加到来自第三方库的类中的私有变量.一路上有大约四种不同的例外可以抛出; 所有这些都与反思有关,而且所有这些都不太可能发生.我正在硬编码所涉及的类和变量的名称.我不太可能收到任何未找到的类或未找到字段的错误,除非该库有一天升级并且已经发生了显着变化.
我宁愿不为我的调用者声明所有这四个异常来处理.他可能永远不会见到他们.我想抓住所有这些并抛出另一个例外,说"发生了Java反射错误;可能是库已经以与此方法不兼容的方式升级和更改了." 是否存在我可以抛出的标准Java异常,它表示只是一般反射错误?我应该定义自己的吗?或者最好只声明这个方法可以抛出所有可能的反射异常?
我经常问自己这些问题:
如果调用代码可能会将所有这四个异常都视为相同(作为一个不可恢复的错误),那么捕获每个异常并重新抛出更一般的(单个)异常绝对是有意义的.如果这样做,请确保将生成的异常作为内部异常附加,以帮助进行另一端的任何调试或故障排除.
如果您不希望发生异常,则可以将所有异常转为断言错误。如果您想处理特定的异常,则可以解开 InvocableTargetException 的包装。如果您想抛出该方法抛出的实际异常而不是 InvocableTargetException ,您可以使用此技巧,但它可能更令人困惑而不是有用
} catch (InvocationTargetException e) {
// Throw any exception in the current thread (even if it is a checked exception)
Thread.currentThread().stop(e.getCause());
}
Run Code Online (Sandbox Code Playgroud)