Sobes.tech
Junior

Co jsou výjimky v C++?

sobes.tech AI

Odpověď od AI

Mechanismus pro zpracování abnormálních situací (chyb), které nastávají během běhu programu. Umožňuje oddělit kód odpovědný za logiku programu od kódu pro zpracování chyb.

Klíčová slova:

  • try: Definuje blok kódu, ve kterém mohou nastat výjimky.
  • catch: Definuje blok kódu, který se vykoná při výskytu určitého typu výjimky.
  • throw: Generuje (vytváří) výjimku. Typ výjimky může být jakýkoli objekt.

Princip fungování:

  1. Kód, který může způsobit chybu, je umístěn do bloku try.
  2. Pokud dojde k výjimce v bloku try (generované pomocí throw), běh programu je přerušen.
  3. Systém hledá vhodný blok catch, který je schopen zpracovat generovanou výjimku (podle typu).
  4. Pokud je nalezen odpovídající catch, jeho kód se vykoná.
  5. Pokud není na aktuální úrovni volání nalezen odpovídající catch, výjimka "se šíří" vzhůru po zásobníku volání, dokud není nalezena vhodná funkce pro zpracování (nebo program skončí nesprávně).

Příklad:

#include <iostream>
#include <stdexcept> // Pro standardní typy výjimek

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Dělení nulou!"); // Generování výjimky
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Volání funkce, která může vyvolat výjimku
        std::cout << "Výsledek: " << result << std::endl; // Tato řádka se nevykoná
    } catch (const std::runtime_error& e) { // Zachycení výjimky typu std::runtime_error
        std::cerr << "Chyba: " << e.what() << std::endl; // Zpracování výjimky
    } catch (...) { // Zachycení jakékoli jiné výjimky
        std::cerr << "Nastala neznámá chyba." << std::endl;
    }

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

Výhody:

  • Oddělení logiky a zpracování chyb.
  • Zjednodušení hlavního toku kódu.
  • Možnost zpracování chyb na různých úrovních hierarchie volání.

Nevýhody:

  • Může ovlivnit výkon (kvůli šíření zásobníku).
  • Obtížnější pochopení toku provádění při více výjimkách.
  • Nesprávné použití může vést ke ztrátám zdrojů (pokud zdroje nejsou správně uvolněny při výskytu výjimky před jejich správným uvolněním).

Pro bezpečnou práci se zdroji při výskytu výjimek se často používá RAII (Resource Acquisition Is Initialization) a chytré ukazatele.