何时使用 std::expected 而不是异常

When to use std::expected instead of exceptions

提问人:Jan Schultke 提问时间:6/13/2023 最后编辑:Jan Schultke 更新时间:9/15/2023 访问量:190

问:

何时应使用 std::expected,何时应使用异常?以这个函数为例:

int parse_int(std::string_view str) {
    if (str.empty()) {
        throw std::invalid_argument("string must not be empty");
    }
    /* ... */
    if (/* result too large */) {
        throw std::out_of_range("value exceeds maximum for int");
    }
    return result;
}

我想在使用此函数时区分不同的错误,因此可以抛出不同类型的异常很有用。但是,我也可以通过以下方式做到这一点:std::expected

enum class parse_error {
    empty_string,
    invalid_format,
    out_of_range
};

std::expected<int, parse_error> parse_int(std::string_view str) noexcept {
    if (str.empty()) {
        return std::unexpected(parse_error::empty_string);
    }
    /* ... */
    if (/* result too large */) {
        return std::unexpected(parse_error::out_of_range);
    }
    return result;
}

是否有任何理由使用异常(性能、代码大小、编译速度、ABI),或者只是风格偏好?std::expected

C++ 异常 错误处理 C++23 标准预期

评论

0赞 273K 6/13/2023
恕我直言,这是 stackoverflow.com/questions/4670987/ 的骗局...... 还有 stackoverflow.com/questions/1849490/...... 不会改变这些方法。std::expected
3赞 Jan Schultke 6/13/2023
@273K,顶部答案中状态代码的某些问题不适用于 。1.由于可以转换为,因此您的代码仍然干净,因此您拥有语法糖;2. 您使用返回类型,您不只返回状态代码。3.您可以随心所欲地携带尽可能多的信息;4. 仍然适用。IMO 错误处理与简单地返回状态代码不同。std::expectedstd::expectedboolstd::expected
0赞 273K 6/13/2023
std::expected只是一个结构。你是对的,这只是一颗糖。“何时使用”链接的答案中不能添加任何新内容。
0赞 Drew Dormann 6/13/2023
现在这个问题已经结束,使用 的性能可靠地更好。二进制大小可能更小。您响应每个可能错误的能力仅存在于 中。std::expectedstd::expectedstd::expected

答: 暂无答案