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_errorstd::runtime_errorstd::bad_allocstd::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í.