答案 0 :(得分:5)
答案 1 :(得分:0)
答案 2 :(得分:0)
许多语言和框架从C ++派生出一般异常处理概念的一个问题是,在异常类型中有太多东西被有效编码。检查异常将是一个很好的概念,如果检查与未检查的区别是在throw和catch站点进行的,而不是在异常的声明中,并且如果有一种简洁的方法指定特定的已检查异常应该作为未选中状态重新抛出。遗憾的是,Java要求给定类型的任何异常始终按照选中的方式抛出,或始终取消选中,具体取决于类型,并且不提供方便或简洁的方法将已检查的异常映射到未选中的异常。相反,它使检查异常渗透为检查异常变得最方便,这会增加“滋扰”因素,同时降低其有用性。
如果在抛出站点上实现了已检查的异常,并且如果处理不需要的已检查异常的正常方法是将它们转换为未选中,则可以确保通过抛出特定的已检查异常来指示特定故障条件的方法只有在“想要”报告该特定故障时才会抛出该检查异常;如果在执行方法期间发生了相同类型的异常(未预料到),则会将其转换为未经检查的异常。这样的“检查异常”模型可能很有用,并且还可以导致比普通异常更高效的代码(因为必须在抛出它们的例程的直接调用者中处理已检查的异常,大部分堆栈展开和堆栈跟踪都需要可以跳过正常的异常处理)。不幸的是,Java的“已检查异常”不能以这种方式工作。