我从C++转向Java。 在Java和C++中,我们都有可能进行异常的指定。它的写法如下:
void function_name() throw(Exception)
{
...
if (error)
{
throw Exception("Error");
}
...
}
据我所知,在C++中编写异常规范被认为是一种不好的做法。与C++不同,在Java中我们必须这样做。因此,我的问题是: 在Java中编写异常规范有什么好处?
我从C++转向Java。 在Java和C++中,我们都有可能进行异常的指定。它的写法如下:
void function_name() throw(Exception)
{
...
if (error)
{
throw Exception("Error");
}
...
}
在方法签名中,您必须指定仅已检查的异常(Exception
类的子类)。未经检查的异常(RuntimeException
类的子类)不需要被指定。
在方法签名中指定异常是Java语言语义所定义的固有实践。但是关于这个问题也存在很多争议。有些团队和项目甚至认为它是不良实践,只使用未经检查的异常。
通常,作为一种良好的实践,当您将其定义为方法的一部分契约时,应抛出一个已检查的异常,即方法调用者必须意识到某些特定(可能且可恢复的)类型的错误,并且要么捕获并处理它,要么将其传递给调用堆栈。未经检查的异常通常表示方法代码中的一些内部错误,因此不需要被捕获。
Java 中没有 利润,异常规范是强制性的。Java 的类型系统比 C++ 更加强大。在 C++ 中,异常规范是可选的,而 Java 设计者认为异常是程序设计的重要部分,因此他们决定在函数可能抛出任何异常时强制执行异常规范。这有时会引起争议,但这是一种语言设计选择。异常是调用契约的一部分。
RuntimeException
子类的异常强制执行。 - Mick Mnemonic
std::throw()
或noexcept
之外的异常规范在编译时无法跟踪。结果是编译器生成的开销,程序员应该考虑这一点(换句话说,这些是无用的)。 - user2249683