• 灵活且可扩展:易于与现有代码库集成,并支持广泛的使用场景。
std::expected<double, std::string> divide(double numerator, double denominator) { if (denominator == 0.0) { return std::unexpected("Error: Division by zero"); } return numerator / denominator; }在这个示例中,divide函数使用std::expected<int, std::string>来表示有效的除法结果或者错误消息。如果除数不为零,函数返回有效的结果;否则,返回错误消息。这种方法使得错误处理变得明确且直观,增强了代码的可读性和可维护性。
// 使用std::expected std::expected<double, std::string> divide_expected(double numerator, double denominator) { if(denominator ==0.0){ return std::unexpected("Error: Division by zero"); } return numerator / denominator; } // 堆代码 duidaima.com // 使用返回码 bool divide_return_code(double numerator, double denominator, double& result, std::string& error) { if(denominator ==0.0){ error ="Error: Division by zero"; returnfalse; } result = numerator / denominator; returntrue; }虽然这种方法可行,但存在几个缺点:
// 使用std::expected std::expected<double, std::string> divide_expected(double numerator, double denominator) { if(denominator ==0.0){ return std::unexpected("Error: Division by zero"); } return numerator / denominator; } // 使用异常 double divide_exception(double numerator, double denominator) { if(denominator ==0.0){ throw std::runtime_error("Error: Division by zero"); } return numerator / denominator; }虽然异常为错误处理提供了一种健壮的机制,但也存在一系列挑战:
// 执行除法并使用std::expected处理错误的函数 std::expected<int, std::string> safe_divide(int numerator, int denominator) { if (denominator == 0) { return std::unexpected("Error: Division by zero"); } return numerator / denominator; }在这个示例中,safe_divide函数接收两个整数并返回一个std::expected<int, std::string>。如果分母为零,函数使用std::unexpected返回一条错误消息;否则,返回除法的结果。
#include <iostream> #include <expected> #include <string> // 执行除法并使用std::expected处理错误的函数 std::expected<int, std::string> safe_divide(int numerator, int denominator) { if(denominator ==0){ return std::unexpected("Error: Division by zero"); } return numerator / denominator; } int main() { // 示例:检查并访问std::expected auto result =safe_divide(10,2); // 检查 if(result.has_value()){ std::cout <<"Result: "<< result.value()<<'\\n'; }else{ std::cout << result.error()<<'\\n'; } auto errorResult =safe_divide(10,0); // 检查 if(errorResult.has_value()){ std::cout <<"Result: "<< errorResult.value()<<'\\n'; }else{ std::cout << errorResult.error()<<'\\n'; } return0; }在这段代码中,result和errorResult是std::expected<int, std::string>对象。has_value()方法用于检查除法是否成功,value()或error()则用于获取结果或错误消息。
#include <iostream> #include <expected> #include <string> #include <cmath> // 执行除法并使用std::expected处理错误的函数 std::expected<int, std::string> safe_divide(int numerator, int denominator) { if(denominator ==0){ return std::unexpected("Error: Division by zero"); } return numerator / denominator; } // 对数字进行平方的函数 int square(int value) { return value * value; } // 使用and_then链式操作,对成功除法的结果进行平方的函数 std::expected<int, std::string> square_if_success(int numerator, int denominator) { returnsafe_divide(numerator, denominator).and_then([](int value){ return std::expected<int, std::string>(square(value)); }); } int main() { // 示例:使用and_then和transform auto result =square_if_success(10,2); // 检查 if(result.has_value()){ std::cout <<"Squared Result: "<< result.value()<<'\\n'; } else{ std::cout << result.error()<<'\\n'; } auto errorResult =square_if_success(10,0); // 检查 if(errorResult.has_value()){ std::cout <<"Squared Result: "<< errorResult.value()<<'\\n'; } else{ std::cout << errorResult.error()<<'\\n'; } // 使用transform对存在的值应用转换 auto transformedResult =safe_divide(10,2).transform([](int value){ return value +1; }); // 检查 if(transformedResult.has_value()){ std::cout <<"Transformed Result: "<< transformedResult.value()<<'\\n'; } else{ std::cout << transformedResult.error()<<'\\n'; } return0; }在这段代码中,square_if_success函数使用and_then链式操作对成功除法的结果进行平方。transform方法同样可用于在值存在的情况下对其应用转换。
#include <iostream> #include <expected> #include <string> // 执行除法并使用std::expected处理错误的函数 std::expected<int, std::string> safe_divide(int numerator, int denominator) { if(denominator ==0){ return std::unexpected("Error: Division by zero"); } return numerator / denominator; } // 给数字加5的函数 std::expected<int, std::string> add_five(int value) { return value +5; } // 对数字进行平方的函数 std::expected<int, std::string> square(int value) { return value * value; } int main() { // 示例:使用and_then链式操作 auto result =safe_divide(20,2) .and_then(add_five) .and_then(square); // 检查 if(result.has_value()){ std::cout <<"Final Result: "<< result.value()<<'\\n'; }else{ std::cout << result.error()<<'\\n'; } // 示例:使用or_else处理错误 auto errorResult =safe_divide(20,0) .and_then(add_five) .and_then(square) .or_else([](std::string error){ std::cerr <<"Error occurred: "<< error <<'\\n'; return std::expected<int, std::string>(0);// 提供默认值 }); // 检查 if(errorResult.has_value()){ std::cout <<"Handled Result: "<< errorResult.value()<<'\\n'; }else{ std::cout << errorResult.error()<<'\\n'; } return0; }在这个示例中,操作通过and_then链式连接在一起,并且每一步只有在前一步成功的情况下才会执行。如果任何操作失败,链就会中断,错误会被传播下去。
#include <iostream> #include <expected> #include <string> // 执行除法并使用std::expected处理错误的函数 std::expected<int, std::string> safe_divide(int numerator, int denominator) { if(denominator ==0){ return std::unexpected("Error: Division by zero"); } return numerator / denominator; } int main() { // 示例:使用transform和transform_error auto result =safe_divide(10,2) .transform([](int value){ return value * value;// 如果值存在,对其进行平方 }); // 检查 if(result.has_value()){ std::cout <<"Transformed Result: "<< result.value()<<'\\n'; }else{ std::cout << result.error()<<'\\n'; } auto errorResult =safe_divide(10,0) .transform_error([](const std::string& error){ return error +" - Please provide a non-zero denominator.";// 给错误消息添加详细信息 }); // 检查 if(errorResult.has_value()){ std::cout <<"Result: "<< errorResult.value()<<'\\n'; }else{ std::cout << errorResult.error()<<'\\n'; } return0; }在这个示例中,transform用于对除法结果进行平方,transform_error用于在出现错误时给错误消息添加额外的详细信息。
#include <iostream> #include <expected> #include <vector> #include <string> // 验证单个输入的函数 std::expected<void, std::string> validate_input(int input) { if(input <0){ return std::unexpected("Error: Negative value not allowed"); } if(input >100) { return std::unexpected("Error: Value exceeds maximum limit"); } return{}; } // 验证多个输入并聚合错误的函数 std::expected<void, std::vector<std::string>>validate_inputs(const std::vector<int>& inputs){ std::vector<std::string> errors; for(constauto& input : inputs){ auto result =validate_input(input); if(!result){ errors.push_back(result.error()); } } // 检查 if(!errors.empty()){ return std::unexpected(errors); } return{}; } int main() { std::vector<int> inputs ={10,-5,150,20}; // 示例:使用std::expected进行错误聚合 auto result =validate_inputs(inputs); // 检查 if(result.has_value()){ std::cout <<"All inputs are valid.\\n"; }else{ std::cout <<"Errors:\\n"; for(constauto& error : result.error()){ std::cout <<"- "<< error <<'\\n'; } } return0; }在这个示例中,validate_inputs函数将错误聚合到一个向量中,并将其作为单个std::expected对象返回。这样能够以简洁明了的方式实现全面的错误报告。