Bagaimana untuk mengendalikan pengecualian dalam ungkapan C++ Lambda?

WBOY
Lepaskan: 2024-06-03 15:01:00
asal
433 orang telah melayarinya

Pengendalian pengecualian dalam ungkapan C++ Lambda tidak mempunyai skopnya sendiri dan pengecualian tidak ditangkap secara lalai. Untuk menangkap pengecualian, anda boleh menggunakan sintaks menangkap ungkapan Lambda, yang membenarkan ungkapan Lambda menangkap pembolehubah dalam skop definisinya untuk pengendalian pengecualian dalam blok cuba-tangkap.

C++ Lambda 表达式如何进行异常处理?

Pengendalian Pengecualian dalam C++ Lambda Expressions

Ekspresi Lambda ialah sintaks fungsi tanpa nama yang dipermudahkan untuk mentakrifkan blok kod. Ia sering digunakan untuk menggantikan fungsi tradisional atau untuk dihantar sebagai input kepada fungsi lain. Walaupun ungkapan lambda sangat berguna, pengendalian pengecualian di dalamnya boleh menjadi mencabar.

Memahami Pengendalian Pengecualian dalam Ungkapan Lambda

Apabila mengendalikan pengecualian dalam ungkapan Lambda, berikut ialah perkara utama yang perlu dipertimbangkan:

  • Ekspresi Lambda tidak mempunyai skopnya sendiri. Mereka mewarisi pembolehubah dan pengendali pengecualian daripada fungsi di mana ia ditakrifkan.
  • Secara lalai, ungkapan Lambda tidak mendapat pengecualian. Jika mereka tidak menangkap pengecualian, mereka menghantarnya ke fungsi panggilan.

Catching Exceptions

Untuk menangkap pengecualian dalam ungkapan Lambda, anda boleh menggunakan sintaks menangkap ungkapan Lambda yang diperkenalkan dalam C++11. Sintaks ini membenarkan ungkapan lambda untuk menangkap pembolehubah dalam skop definisinya.

Berikut ialah contoh ungkapan Lambda yang mendapat pengecualian:

auto lambda = [function]() -> int {
  try {
    // 业务逻辑
  } catch (const std::exception& e) {
    // 异常处理代码
    return -1;
  }
};
Salin selepas log masuk

Dalam contoh ini, ungkapan Lambda menangkap fungsi dan melaksanakannya dalam try-catch blok Panggilannya melaksanakan pengendalian pengecualian. Jika pengecualian berlaku, ungkapan lambda mengembalikan -1. function,并在 try-catch 块中对其调用进行异常处理。如果发生异常,Lambda 表达式将返回 -1。

实战案例

考虑以下需要大量数据处理的案例:

std::vector<int> numbers = {1, 2, 3, 4, 5};

int sum = std::accumulate(numbers.begin(), numbers.end(), 0, [](int a, int b) {
  try {
    if (b == 0) {
      throw std::runtime_error("除以零");
    }
    return a / b;
  } catch (const std::exception& e) {
    std::cerr << "异常信息:" << e.what() << std::endl;
    return 0;
  }
});
Salin selepas log masuk

在这个示例中,Lambda 表达式捕获了对 std::accumulate 中提供的 numbers 向量进行迭代的范围。Lambda 表达式尝试计算每个元素之间的商,如果 b

🎜Kes Praktikal🎜🎜🎜Pertimbangkan kes berikut yang memerlukan pemprosesan data yang berat: 🎜rrreee🎜Dalam contoh ini, ungkapan Lambda menangkap nomborstd::accumulate /code > Julat vektor untuk diulang. Ungkapan lambda cuba mengira hasil bagi setiap elemen dan membuang pengecualian jika b ialah 0. Jika pengecualian berlaku, ungkapan lambda mencetak mesej pengecualian dan mengembalikan 0. 🎜

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

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!