std::exception v C++: Základní kámen pro práci s výjimkami

Výjimky jsou v C++ klíčovým mechanismem pro zpracování chyb a neočekávaných situací během běhu programu. Jedním z nejdůležitějších prvků tohoto mechanismu je třída std::exception, která slouží jako základní třída pro všechny výjimky v knihovně standardu C++. V tomto článku se podíváme na to, co std::exception nabízí, jak ji používat a proč je důležitá pro robustní a čitelný kód.


Co je std::exception?

std::exception je abstraktní třída definovaná v hlavičkovém souboru <exception>. Poskytuje základní rozhraní pro všechny výjimky v C++ a umožňuje jednotný přístup k chybovým stavům. Je navržena tak, aby byla rozšiřitelná, což znamená, že můžete vytvářet vlastní třídy výjimek, které z ní dědí.

Deklarace třídy

namespace std {
    class exception {
    public:
        exception() noexcept;
        exception(const exception&) noexcept;
        exception& operator=(const exception&) noexcept;
        virtual ~exception();

        virtual const char* what() const noexcept;
    };
}

Klíčové vlastnosti

1. Metoda what()

Metoda what() je virtuální metoda, která vrací popis výjimky jako řetězec typu const char*. Tato metoda je užitečná pro ladění a poskytuje informace o tom, co se pokazilo.

Příklad použití:

#include <iostream>
#include <exception>

int main() {
    try {
        throw std::exception();
    } catch (const std::exception& e) {
        std::cout << "Výjimka: " << e.what() << std::endl;
    }
    return 0;
}

Výstup:

Výjimka: std::exception

2. Bezpečnost a výkonnost

Všechny metody třídy std::exception jsou označeny klíčovým slovem noexcept, což znamená, že tyto metody nikdy nevyvolají výjimku. To je důležité pro zajištění stability programu i v případě, že dojde k chybě.


Dědění z std::exception

C++ standardní knihovna poskytuje několik tříd, které dědí z std::exception, například:

  • std::logic_error
  • std::runtime_error
  • std::bad_alloc
  • std::out_of_range

Tyto třídy poskytují konkrétnější informace o různých typech chyb. Například std::bad_alloc se používá při selhání alokace paměti.

Příklad:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::out_of_range("Index mimo rozsah!");
    } catch (const std::exception& e) {
        std::cout << "Výjimka: " << e.what() << std::endl;
    }
    return 0;
}

Výstup:

Výjimka: Index mimo rozsah!

Vytváření vlastních výjimek

Pokud potřebujete vytvořit vlastní typ výjimky, můžete jednoduše zdědit z std::exception a přepsat metodu what():

#include <iostream>
#include <exception>

class MyException : public std::exception {
public:
    const char* what() const noexcept override {
        return "Moje vlastní výjimka!";
    }
};

int main() {
    try {
        throw MyException();
    } catch (const std::exception& e) {
        std::cout << "Výjimka: " << e.what() << std::endl;
    }
    return 0;
}

Výstup:

Výjimka: Moje vlastní výjimka!

Shrnutí

Třída std::exception je základním stavebním kamenem pro práci s výjimkami v C++. Poskytuje jednotné rozhraní pro zpracování chyb a umožňuje vytváření vlastních výjimek. Díky metodě what() můžete snadno získat informace o chybě, což zjednodušuje ladění a zvyšuje čitelnost kódu. Pokud chcete psát robustní a udržovatelný kód, je důležité porozumět této třídě a jejímu použití.

ai (1) architekt (1) Bash (2) bitwig (2) bitwig6 (1) c++ (54) cheatsheet (1) clang-format (1) class (1) cmake (3) cmake-format (1) conan (2) constexpr if (1) cz (2) daw (2) decltype(x) (1) desktop (2) duševní zdraví (1) email (1) emoce (4) enum (1) enum class (1) functor (1) git (1) gnome (4) gnome-extension (1) helloworld (2) hranice (1) js (1) keyboard (2) linux (6) llm (1) lvalue (1) metodika řízení (2) midi (2) modern c++ (48) motivace (1) music (6) music production (1) native instruments (1) nodiscard (1) noexcept (1) operator (1) osobnost (1) osobní hranice (1) override (1) package manager (1) Perfect Forwarding (1) plugin (1) poděkování (1) polymorfism (1) prospěch (1) psyché (2) python (2) rspamd (1) rvalue (1) růst (2) scale (2) self-stress (1) sociální sítě (1) software (1) spam (1) std (28) std::accumulate (1) std::async (2) std::divides (1) std::filesystem::path (2) std::forward (1) std::future (3) std::istream_iterator (1) std::latch (1) std::lerp (1) std::minus (1) std::modulus (1) std::multiplies (1) std::negate (1) std::ostream_iterator (1) std::packaged_task (1) std::partition (1) std::partition_copy (1) std::plus (1) std::promise (2) std::shiftleft (1) std::shuffle (1) std::transform (1) std::tuple (1) std::variant (1) std::views::transform (1) std::visit (1) strach (1) strategie (1) synthesizer (1) toxic (2) toxicita (1) toxík (1) using (2) vztah k sobě (1) vztahy (3) vývoj (1) zdraví (2)