闽公网安备 35020302035485号

• 灵活且可扩展:易于与现有代码库集成,并支持广泛的使用场景。
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对象返回。这样能够以简洁明了的方式实现全面的错误报告。