不要使用具有具体类型列表的异常规范。确定一个函数不会抛出异常,可以考虑使用noexcept
。在其他情况下,为确保代码的清晰性和可维护性,最好省略异常规范并在文档和/或注释中说明函数可能抛出的异常。
在C++中,可以在函数声明后指明可能会抛出的异常类型。这被称为异常规范。但是,异常规范的使用是有争议的,而且在某些情况下可能会引发不预期的问题。
以下是如何使用异常规范:
void myFunction() throw(int) {
// ... function body
}
在上述代码中,myFunction
函数指定了只会抛出int
类型的异常。
但是,请注意以下几点:
-
限制性:异常规范限制了函数可能抛出的异常类型。如果函数抛出了异常规范外的异常,
std::unexpected
将会被调用。这可能导致程序意外地终止。 -
维护问题:当函数实现变更时,异常规范可能需要重新评估和更新,这可能会导致维护问题。
-
性能问题:在某些编译器和平台上,异常规范可能导致额外的运行时开销。
-
C++11后的变化:从C++11开始,引入了
noexcept
规范,它表示函数不会抛出异常。与早期的throw()
不同,noexcept
对性能的影响更为正面,并且在现代C++编码中更为推荐。
void myFunction() noexcept {
// ... function body
}