Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah ungkapan lambda mengendalikan pengecualian dalam C++?

Bagaimanakah ungkapan lambda mengendalikan pengecualian dalam C++?

WBOY
WBOYasal
2024-04-17 12:42:021036semak imbas

Dalam C++, terdapat dua cara untuk mengendalikan pengecualian menggunakan ungkapan Lambda: tangkap pengecualian menggunakan blok cuba-tangkap dan kendalikan atau buang semula pengecualian dalam blok tangkapan. Gunakan fungsi pembalut jenis std::functionf84160cf178f81a7d5a39a6f2f61366c yang kaedah try_emplacenya boleh menangkap pengecualian dalam ungkapan Lambda.

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

Menggunakan Ungkapan Lambda untuk Mengendalikan Pengecualian dalam C++

Pengenalan

Ungkapan Lambda ialah fungsi tanpa nama yang menangkap pembolehubah luaran dan lulus parameter mengikut nilai Dalam C++, ungkapan lambda boleh digunakan untuk pelbagai tujuan, termasuk pengendalian pengecualian.

Menggunakan blok cuba-tangkap

blok cuba-tangkap ialah cara standard untuk mengendalikan pengecualian dalam ungkapan Lambda. Blok tangkapan membolehkan menangkap jenis pengecualian tertentu atau semua pengecualian. Contoh berikut menunjukkan cara menggunakan blok try-catch dalam ungkapan Lambda untuk mengendalikan pengecualian:

#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;
}

Menggunakan std::function

Cara lain untuk mengendalikan pengecualian dalam ungkapan Lambda ialah menggunakan std:: fungsi . std::function ialah fungsi pembungkus yang menerima jenis fungsi yang berbeza, termasuk ungkapan Lambda. std::function menyediakan kaedah try_emplace yang membenarkan pengecualian ditangkap dalam ungkapan Lambda. Contoh berikut menunjukkan cara menggunakan std::function untuk mengendalikan pengecualian: 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;
}

实战案例

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

int do_something(const std::string& input);

此函数可能引发 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;
  }
};

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

🎜Contoh praktikal🎜🎜🎜Pertimbangkan fungsi dengan antara muka berikut: 🎜rrreee🎜Fungsi ini mungkin membuang std: :invalid_argument Pengecualian jika input tidak sah. Kami boleh mengendalikan pengecualian ini menggunakan ungkapan Lambda dan blok try-catch seperti yang ditunjukkan di bawah: 🎜rrreee🎜Kami kemudiannya boleh memanggil do_something_safe dengan selamat dalam kod kami sementara Tidak perlu mengendalikan pengecualian secara eksplisit. 🎜

Atas ialah kandungan terperinci Bagaimanakah ungkapan lambda mengendalikan pengecualian dalam C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn