Maison > développement back-end > C++ > Comment les expressions lambda gèrent-elles les exceptions en C++ ?

Comment les expressions lambda gèrent-elles les exceptions en C++ ?

WBOY
Libérer: 2024-04-17 12:42:02
original
1030 Les gens l'ont consulté

En C++, il existe deux façons de gérer les exceptions à l'aide d'expressions Lambda : intercepter l'exception à l'aide d'un bloc try-catch et gérer ou renvoyer l'exception dans le bloc catch. Utilisez une fonction wrapper de type std::function dont la méthode try_emplace peut intercepter les exceptions dans les expressions Lambda.

lambda 表达式在 C++ 中如何处理异常?

Utilisation d'expressions Lambda pour gérer les exceptions en C++

Introduction

Une expression Lambda est une fonction anonyme qui capture des variables externes et transmet des paramètres par valeur ou référence. En C++, les expressions lambda peuvent être utilisées à diverses fins, notamment pour gérer les exceptions.

Utilisation des blocs try-catch

Les blocs try-catch sont le moyen standard de gérer les exceptions dans les expressions Lambda. Le bloc catch permet d'intercepter des types spécifiques d'exceptions ou toutes les exceptions. L'exemple suivant montre comment utiliser un bloc try-catch dans une expression Lambda pour gérer les exceptions :

#include <functional>
#include <iostream>

int main() {
  auto lambda =  [](int x) -> int {
    try {
      return x / 0;  // 将引发 std::runtime_error 异常
    } catch (const std::exception& e) {
      std::cout << "Exception caught: " << e.what() << std::endl;
      return -1;
    }
  };

  int result = lambda(10);
  std::cout << "Result: " << result << std::endl;
  return 0;
}
Copier après la connexion

Utilisation de std::function

Une autre façon de gérer les exceptions dans une expression Lambda consiste à utiliser std:: fonction . std::function est une fonction wrapper qui accepte différents types de fonctions, y compris les expressions Lambda. std::function fournit une méthode try_emplace qui permet d'intercepter les exceptions dans les expressions Lambda. L'exemple suivant montre comment utiliser std::function pour gérer les exceptions : std::functionstd::function 是一种包装函数,它可以接受不同的函数类型,包括 Lambda 表达式。std::function 提供了一个 try_emplace 方法,它允许在 Lambda 表达式中捕获异常。以下示例演示了如何使用 std::function 来处理异常:

#include <functional>
#include <iostream>

int main() {
  std::function<int(int)> lambda;
  try {
    lambda = [](int x) -> int { return x / 0; };  // 将引发 std::runtime_error 异常
  } catch (const std::exception& e) {
    std::cout << "Exception caught: " << e.what() << std::endl;
    lambda = [](int x) -> int { return -1; };
  }

  int result = lambda(10);
  std::cout << "Result: " << result << std::endl;
  return 0;
}
Copier après la connexion

实战案例

考虑一个具有以下接口的函数:

int do_something(const std::string& input);
Copier après la connexion

此函数可能引发 std::invalid_argument 异常,如果 input 无效。我们可以使用 Lambda 表达式和 try-catch 块来处理此异常,如下所示:

auto do_something_safe = [](const std::string& input) -> int {
  try {
    return do_something(input);
  } catch (const std::invalid_argument& e) {
    // 处理异常并返回 -1
    std::cout << "Invalid input: " << e.what() << std::endl;
    return -1;
  }
};
Copier après la connexion

然后,我们可以在代码中安全地调用 do_something_saferrreee

🎜Un exemple pratique🎜🎜🎜Considérez une fonction avec l'interface suivante : 🎜rrreee🎜Cette fonction peut lancer std : :invalid_argument Exception si input n'est pas valide. Nous pouvons gérer cette exception en utilisant une expression Lambda et un bloc try-catch comme indiqué ci-dessous : 🎜rrreee🎜 Nous pouvons alors appeler en toute sécurité do_something_safe dans notre code, et ce n'est pas nécessaire gérer les exceptions explicitement. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal