Sobes.tech
Junior

Čo sú výnimky v C++?

sobes.tech AI

Odpoveď od AI

Mechanizmus spracovania anomálnych situácií (chýb), ktoré vznikajú počas vykonávania programu. Umožňuje oddeliť kód zodpovedný za logiku programu od kódu spracovania chýb.

Kľúčové slová:

  • try: Určuje blok kódu, v ktorom môžu nastať výnimky.
  • catch: Určuje blok kódu, ktorý sa vykoná pri výskyte určitého typu výnimky.
  • throw: Generuje (vytvára) výnimku. Typ výnimky môže byť akýkoľvek objekt.

Princíp práce:

  1. Kód, ktorý môže spôsobiť chybu, sa umiestni do bloku try.
  2. Ak v bloku try vznikne výnimka (pomocou throw), bežné vykonávanie programu sa preruší.
  3. Systém hľadá vhodný blok catch, schopný spracovať generovanú výnimku (podľa typu).
  4. Ak je nájdený zodpovedajúci catch, jeho kód sa vykoná.
  5. Ak sa na aktuálnej úrovni volaní nenájde vhodný catch, výnimka "sa rozšíri" nahor po zásobníku volaní, kým sa nenájde vhodná funkcia na spracovanie (alebo program sa ukončí nesprávne).

Príklad:

#include <iostream>
#include <stdexcept> // Pre štandardné typy výnimiek

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division by zero!"); // Generujeme výnimku
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Voláme funkciu, ktorá môže vyhodiť výnimku
        std::cout << "Result: " << result << std::endl; // Táto línia sa nevykoná
    } catch (const std::runtime_error& e) { // Chytáme výnimku typu std::runtime_error
        std::cerr << "Error: " << e.what() << std::endl; // Spracovávame výnimku
    } catch (...) { // Chytáme akúkoľvek inú výnimku
        std::cerr << "An unknown error occurred." << std::endl;
    }

    std::cout << "Program pokračuje po spracovaní chyby." << std::endl;
    return 0;
}

Výhody:

  • Oddelenie logiky od spracovania chýb.
  • Zjednodušenie hlavného toku vykonávania.
  • Možnosť spracovania chýb na rôznych úrovniach hierarchie volaní.

Nevýhody:

  • Môžu ovplyvniť výkon (kvôli rozbaleniu zásobníka).
  • Zložitejšie pochopenie toku vykonávania pri viacerých výnimkách.
  • Nesprávne použitie môže viesť k únikom zdrojov (ak zdroje nie sú uvoľnené pri vzniku výnimky pred ich správnym uvoľnením).

Pre bezpečnú prácu so zdrojmi pri výskyte výnimiek sa často používajú RAII (Resource Acquisition Is Initialization) a inteligentné ukazovatele.