Sobes.tech
Middle+

Агар дар функсияе, ки ҳамчун noexcept ишора шудааст, истисно рух диҳад, чӣ мешавад?

sobes.tech AI

Ҷавоб аз AI

Барнома фавран бо даъвати std::terminate() ба охир мерасад. Ин рафтори стандартӣ дар C++ барои идоракунии истисноҳо, ки аз доираи функсияи эълоншуда ҳамчун noexcept мегузаранд, муайян шудааст.

Бобҳо дар стандартии C++ ки ба ин мавзӯъ дахл доранд:

  • [except.spec] Тавсифи noexcept.
  • [except.terminate] Идоракунӣ тавассути даъвати std::terminate().

Масалан:

#include <iostream>
#include <stdexcept>
#include <cstdlib> // Барои std::terminate

void f() noexcept {
    throw std::runtime_error("Хатое дар функсияи noexcept рӯ дод");
}

int main() {
    try {
        f();
    } catch (...) {
        // Ин блок catch намерасад
        std::cerr << "Истисно гирифта шуд" << std::endl;
    }

    // Агар f() истисно барорад, std::terminate() пеш аз ин хати даъват мешавад
    std::cout << "Барнома идома меёбад (ин намоиш дода намешавад)" << std::endl;

    return 0;
}

Натиҷаи ин барнома хабар аз дастгоҳи std::terminate() хоҳад буд, ки вобаста ба иҷроиш метавонад тағйир ёбад, аммо одатан маълумот дар бораи сабаби қатъ карданро дар бар мегирад.

terminate called after throwing an instance of 'std::runtime_error'
  what():  Хатое дар функсияи noexcept