只有当我有一个必须返回某些东西并且我可以返回的函数时,我才使用 throw。当我返回指针时,一个空指针就足够了,但是当返回引用时,你什么都不能返回,所以我抛出了。其中一部分,我从不扔,也从不抓,因为你说的原因。
C++ 有更好的错误处理功能。首先,在以后的 C++ 版本中会有函数契约。它将允许您这样做:
struct Database {
SomeResult query(std::string) [[expect: connected]] {
// ...
}
private:
bool connected = false;
};
而且错误处理程序是可自定义的,所以可能是异常,也可能是std::terminate。
还有std::expected 提案。这是一个您现在可以在 boost 实现中使用的实用程序。
它允许函数要么返回结果,要么返回错误。然后,该函数的用户可以以比catch 更漂亮的方式正确处理它。考虑以下示例,取自提案:
有了预期,我们不需要使用异常,我们可以使用
std::error_condition 比
std::exception_ptr 如果我们想使用错误。为了...的目的
这个例子,我们使用下面的枚举(样板代码
关于 std::error_condition 没有显示):
enum class arithmetic_errc
{
divide_by_zero, // 9/0 == ?
not_integer_division // 5/2 == 2.5 (which is not an integer)
};
使用expected,代码变为:
expected<double,error_condition> safe_divide(double i, double j)
{
if (j==0) return make_unexpected(arithmetic_errc::divide_by_zero); // (1)
else return i / j; // (2)
}
在提案中,它表明您可以像这样更改用户功能:
例如,基于异常的函数 i + j/k 是:
double f1(double i, double j, double k)
{
return i + safe_divide(j,k);
}
但变成使用预期:
expected<double, error_condition> f1(double i, double j, double k)
{
auto q = safe_divide(j, k)
if(q) return i + *q;
else return q;
}
它稍后表明您也可以使用 std::expected::map 编写它的缩短版本:
expected<double, error_condition> f1(double i, double j, double k)
{
return safe_divide(j, k).map([&](double q){
return i + q;
});
}
您可以在此处阅读这两个提案:Simple Contact for C++ 和 std::expected proposal