Sdílet prostřednictvím


Chyby a zpracování výjimek (moderní Příručka programování C++)

V jazyce C++ moderní ve většině scénářů je preferovaný způsob hlášení a zpracování logické chyby a chyby runtime použití výjimky.To platí zejména při zásobníku může obsahovat několik volání funkcí mezi funkce, která zjistí chybu a funkce, která má kontext vědět, jak ji zpracovat.Výjimky umožňují formální, dobře definované pro kód, který detekuje chyby předat informace až zásobníku volání.

Chyby programu jsou obecně rozdělit do dvou kategorií: logické chyby, které jsou způsobeny programové chyby, například "index mimo rozsah" chyby a chyby runtime, které jsou mimo kontrolu programátor, například chybu "sítě služba není k dispozici".C styl programování a COM chybách spravován vracející hodnotu, která představuje kód chyby nebo kód stavu určité funkce nebo nastavením globální proměnné, kterou se volající může volitelně načíst po každém volání funkce a zjistěte, zda byly hlášeny chyby.Programování v modelu COM použije vrácenou hodnotu HRESULT chyby volajícímu komunikovat a načíst poslední chyba, který ohlásil zásobník volání funkce GetLastError má rozhraní Win32 API.V obou případech je volající kód rozpoznat a přiměřeně reagovat na ni.Pokud volající nemá explicitně zpracovat kód chyby, program může selhat bez varování nebo nadále spouštět s chybná data a nesprávné výsledky.

Výjimky v moderní C++ preferované z následujících důvodů:

  • Výjimku vynutí volající kód chybovou podmínku rozpoznat a zpracovat ji.Neošetřené výjimky zastavit provádění programu.

  • Výjimku přejde na bod v zásobníku volání, který může zpracovávat chyby.Dílčí funkce nechat výjimku rozšířit.Není nutné koordinovat s vrstvami.

  • Mechanismus příkazem zásobníku výjimek zničí všechny objekty v oboru podle pravidla přesně po vyvolání výjimky.

  • Výjimku povoluje čisté oddělení kód, který zjistí chybu a kód, který zpracovává chyby.

Zjednodušený příklad zobrazuje syntaxi nezbytné pro vyvolání a zachycování výjimek v jazyce C++.

 
#include <stdexcept>
#include <limits>
#include <iostream>
 
using namespace std;
class MyClass
{
public:
   void MyFunc(char c)
   {
      if(c < numeric_limits<char>::max())
         throw invalid_argument("MyFunc argument too large.");
      //...
   }
};

int main()
{
   try
   {
      MyFunc(256); //oops!
   }
 
   catch(invalid_argument& e)
   {
      cerr << e.what() << endl;
      return -1;
   }
   //...
   return 0;
}

Výjimky v jazyce C++ vypadat v jazyce C# a Java.V try blokovat, jestliže je výjimka vyvolaných je ulovených podle první spojené catch blok, jejichž typ odpovídá výjimku.Jinými slovy, spuštění přejde z throw prohlášení catch prohlášení.Pokud není nalezena žádná bloku catch použitelné, std::terminate je vyvolána a ukončí program.V jazyce C++ může být vyvolána libovolného typu; Doporučujeme však vyvolávat typ přímo nebo nepřímo z std::exception.V předchozím příkladu typ výjimky invalid_argument, je definována v knihovně standardní <stdexcept> hlavičky souboru.C++ neposkytuje a nevyžaduje, finally blok, zda všechny prostředky jsou uvolněny, pokud je vyvolána výjimka.Získávání prostředků je idiomu inicializace (RAII), které používá inteligentní ukazatele poskytuje funkce požadované pro vyčištění zdroje.Další informace naleznete v tématu Jak: návrh pro bezpečnost výjimku (C++).Informace o mechanismu C++ zásobníku příkazem Výjimky a zásobníku příkazem jazyka C++.

Základní pokyny

Zpracování chyb robustní je náročné v jakémkoli programovacím jazyce.Ačkoli výjimky několik funkcí, které podporují dobré zpracování chyb, není na práci pro vás.Abyste poznali výhody výjimky mechanismus mějte výjimky při návrhu vašeho kódu.

  • Použití nepodmíněných výrazů Kontrola chyb, které by nikdy nedojde.Výjimky slouží ke kontrole chyb, které mohou nastat například chyby při ověřování vstupních parametrů veřejné funkce.Další informace naleznete v tématu Exceptions VS. Assertions.

  • Pokud kód, který zpracovává chyby může být odděleny z kódu, který rozpozná chyby jednoho nebo více volání funkce požadovanými používáte výjimky.Zvažte, zda použít kódy chyb místo výkonu kritické smyčky po kód, který zpracovává chyby, pevně připojen na kód, který rozpozná.Další informace o není použití výjimky viz When Not to Use Exceptions.

  • Každá funkce, která může být vyvolána nebo rozšířit výjimku, poskytují záruky tři výjimky: záruka silné, základní záruka nebo záruka nothrow (noexcept).Další informace naleznete v tématu Jak: návrh pro bezpečnost výjimku (C++).

  • Podle hodnoty vyvolávají výjimky, je zachytit odkazem.Nechcete zachytit co nemůže zpracovat.Další informace naleznete v tématu Pokyny pro vyvolání a zachycení výjimek (C++).

  • Nepoužívejte s výjimkou specifikací, které jsou nyní v C ++ 11.Další informace naleznete v tématu Exception specifications and noexcept.

  • Používejte standardní knihovny typů výjimky se vztahují.Odvození typy vlastní výjimku z Výjimka třída hierarchie.Další informace naleznete v tématu Jak: použít standardní výjimku objekty knihovny.

  • Nepovolovat výjimky z destruktory escape nebo paměti navracení zpět funkce.

Výjimky a výkon

Výjimka mechanismus má minimální výkon náklady, pokud žádná výjimka.Pokud je vyvolána výjimka, je zhruba srovnatelné s náklady na volání funkce ze zásobníku křížovou kontrolu nákladů a unwinding.Jsou požadovány ke sledování zásobníku volání po další datové struktury try bloku je zadán a další pokyny jsou povinny unwind zásobníku, pokud je vyvolána výjimka.Však ve většině scénářů nákladů, výkon a otisk paměti není důležité.Nepříznivý vliv na výkon výjimky je pravděpodobně významné pouze v systémech velmi omezený paměti nebo v důležitých pro výkon cyklicky kde chyba je pravděpodobně dochází pravidelně a kód pro zpracování pevně připojen na kód, který ji.V žádném případě není možné zjistit skutečné náklady výjimky bez profilování a měření.I v těch výjimečných případech při náklady je významný, je můžete zváží proti zvýšené správnosti, jednodušší požadavky na servis a jiné výhody poskytované zásad dobře výjimku.

Výjimky VS. tvrzení

Výjimky a nepodmíněných výrazů jsou dva odlišné mechanismy pro zjištění chyby chodu programu.Použití nepodmíněných výrazů k testování podmínky během vývoje, který by měl být nikdy true, pokud je váš kód správně.Neexistuje žádný bod v takové chybě zpracování pomocí výjimky, protože Chyba určuje, že něco v kódu má být stanovena a nereprezentuje podmínky, že program má napadení v době spuštění.Neplatného výrazu zastaví v prohlášení, takže můžete zkontrolovat stav programu v ladicím programu; výjimku pokračuje spuštění z první odpovídající úlovku popisovač.Pomocí výjimky chybové podmínky, které mohou nastat při běhu i v případě, že kód je správná, například "soubor nebyl nalezen" nebo "nedostatek paměti." Můžete obnovit tyto podmínky i v případě obnovení pouze zprávu do protokolu výstup a ukončí program.Vždy zkontrolujte argumenty funkce veřejné pomocí výjimky.I když funkce bez chyb, zda máte úplnou kontrolu nad argumenty, které může předat uživateli.

C++ výjimky oproti systému Windows S výjimkami

C a C++ programy mohou používat structured exception zpracování mechanismus (SEH) v operačním systému Windows.Koncepty SEH vypadat v C++ výjimky, používá SEH __try, __except, a __finally konstrukce namísto try a catch.V jazyce C++ jsou implementovány C++ výjimky pro SEH.Při psaní kódu jazyka C++ však použijte syntaxi jazyka C++ výjimku.

Další informace o SEH Structured Exception zpracování (C++).

Specifikace výjimku a noexcept

Specifikace výjimky byly zavedeny v C++ a tak určit výjimky, které může být vyvolána funkce.Však prokázáno, že v praxi problematické výjimku specifikace a jsou nyní v C ++ 11 návrh normy.Doporučujeme používat výjimky specifikace, s výjimkou throw(), která označuje, že výjimka umožňuje uniknout žádné výjimky.Pokud je nutné použít výjimku specifikace typu throw(typu), mějte na paměti, Visual C++ odchyluje od standardní určitými způsoby.Další informace naleznete v tématu Specifikace výjimky.noexcept Specifikátor je zavedena v C ++ 11 jako upřednostňovanou alternativou k throw().

Viz také

Koncepty

Jak: rozhraní mezi výjimečné a jiných výjimečných kód

Další zdroje

Moderní Příručka programování v jazyce C++

C++ jazyková Reference

Referenční Standardní knihovna C++