卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章79285本站已运行4413

C++ Lambda 表达式与异常处理的关联

c++++ lambda 表达式中的异常处理取决于捕获类型:捕获变量:异常传播到捕获变量的范围。无状态函数:异常向外传播到调用 lambda 表达式的代码块。

C++ Lambda 表达式与异常处理的关联

C++ Lambda 表达式与异常处理的关联

C++ 中的 Lambda 表达式是一种轻量级的闭包,它可以捕获其定义作用域中的变量,Lambda 表达式可以像函数一样使用,并且可以使用在算法、数据结构和并发编程等各种场景。

当 Lambda 表达式中发生异常时,处理过程会与普通函数中的异常处理略有不同。在 Lambda 表达式中,异常会根据 Lambda 表达式的捕获类型进行传播:

  • 如果 Lambda 表达式捕获任何变量(通过 [capture] 语法),则异常将传播到捕获变量的范围。
  • 如果 Lambda 表达式未捕获任何变量(即作为一个无状态函数),則异常将向外传播到调用 Lambda 表达式的代码块。

实战案例

立即学习“C++免费学习笔记(深入)”;

考虑以下示例:

auto func = []() {
  // 捕获局部变量 num
  int num = 42;
  if (num > 100) {
    // 抛出异常
    throw std::runtime_error("Number is too large");
  }
};

在这个示例中,Lambda 表达式捕获了局部变量 num。如果在其内部抛出异常,异常将传播到 main() 函数中:

int main() {
  try {
    func();
  } catch (const std::exception& e) {
    std::cerr << e.what() << std::endl; // 输出异常信息
  }
  return 0;
}

输出:

Number is too large

现在,考虑另外一个示例:

auto func = []() {
  // 未捕获任何变量
  if (42 > 100) {
    // 抛出异常
    throw std::runtime_error("Number is too large");
  }
};

在这个示例中,Lambda 表达式未捕获任何变量。因此,如果在其内部抛出异常,异常将向外传播到调用 Lambda 表达式的代码块:

int main() {
  try {
    // 直接调用 Lambda 表达式
    func();
  } catch (const std::exception& e) {
    std::cerr << e.what() << std::endl; // 输出异常信息
  }
  return 0;
}

输出:

terminate called after throwing an instance of 'std::runtime_error'
  what():  Number is too large

在这个 case 中,由于 Lambda 未捕获任何外部变量,异常直接导致了程序终止。

卓越飞翔博客
上一篇: C++ 函数参数的按引用传递的性能优势体现在哪些方面?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏