Sobes.tech
Junior

C++та кандайча чыгымдар бар?

sobes.tech AI

AIден жооп

Механизм иштиҳолий шарттар (хатоҳо) дар вақти иҷрои барнома рӯй додани, ки барои ҷудо кардани коди логикаи барнома аз коди коркарди хатоҳо кӯмак мерасонад.

Калидвожаҳо:

  • try: Блоку коди муайян мекунад, ки дар он эҳтимолан метавонанд истисноҳо рӯй диҳанд.
  • catch: Блоку коди муайян мекунад, ки дар вақти рӯй додани навъи муайяни истисно чӣ бояд кард.
  • throw: Истисноро тавлид мекунад (сохт). Навъи истисно метавонад ҳар объект бошад.

Принсипи кор:

  1. Коде, ки метавонад хатогӣ ба вуҷуд орад, ба блоку try гузошта мешавад.
  2. Агар дар блоку try истисно (бо ёрии throw) пайдо шавад, иҷрои одии барнома қатъ мешавад.
  3. Система ҷустуҷӯ мекунад, ки блоку catch мувофиқро, ки метавонад истиснои тавлидшударо коркард кунад, пайдо кунад.
  4. Агар catch мувофиқ ёбад, коди он иҷро мешавад.
  5. Агар дар сатҳи ҳозира catch ёб нашавад, истисно ба боло поён меафтад, то он ки функсияи мувофиқ ёбад ё барнома нодуруст ба анҷом расад.

Масалан:

#include <iostream>
#include <stdexcept> // Барои навъҳои стандартии истисно

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division by zero!"); // Тавлид кардани истисно
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Звон ба функсия, ки метавонад истисно диҳад
        std::cout << "Result: " << result << std::endl; // Ин сатр иҷро намешавад
    } catch (const std::runtime_error& e) { // Гирифтани истиснои навъи std::runtime_error
        std::cerr << "Error: " << e.what() << std::endl; // Коркарди истисно
    } catch (...) { // Гирифтани ҳар гуна истиснои дигар
        std::cerr << "An unknown error occurred." << std::endl;
    }

    std::cout << "Program continues after error handling." << std::endl;
    return 0;
}

Умумиятҳо:

  • Ҷудо кардани логика аз коркарди хатоҳо.
  • Осон кардани ҷараёни асосии иҷроиш.
  • Имконият барои коркарди хатоҳо дар сатҳҳои гуногуни ҳиерархия.

Норасоиҳо:

  • Мумкин аст, ки ба иҷроиш таъсир расонанд (зеро, бо сабаби паҳн кардани стека).
  • Таҳмини ҷараёни иҷроишро дар ҳоли ҳозир, ки бисёр истисноҳо ҳастанд, мураккаб мекунад.
  • Истифодаи нодуруст метавонад ба рехтани захираҳо оварда расонад (агар захираҳо пеш аз озод кардани онҳо дар вақти пайдоиши истисно, озод нашаванд).

Барои коркарди бехатари захираҳо дар ҳузури истисноҳо, одатан истифода мешаванд RAII (Resource Acquisition Is Initialization) ва ишораҳои оқил.