C++ i wyjątki

Opublikowane: 26/11/2014

w kategorii Zasoby.

Wyjątki pozwalają programiście na koncetrację na logice biznesowej i przeniesienie całej obsługi błędów w wybrane miejsce. Niektórzy programiści je nienawidzą, inni pozwalają na ich opcjonalne użycie (na przykład: "basic_ios::exceptions" flags), niektórzy używają ich wszędzie gdzie ma to sens.

Wyjątki mogą być zgłoszone jako klasy, liczby całkowite lub wskaźniki, jednak zwykle zgłaszasz je jako instancje obiektów przez referencje.

#include <iostream>
#include <exception>
using namespace std;

struct DivByZeroException: public exception
{
  const char * what () const throw ()
  {
    return "Dzielenie przez zero";
  }
};

// c = a / b
int divide(int a, int b)
{
    if (b == 0)
        throw DivByZeroException();

    return a/b;
}

int main () 
{
  try
  {
    int b = 0;
    c = divide(2,b);
  }
  catch (exception& e)
  {
    cout << "Błąd: " << e.what() << endl;
  }
  return 0;
}

Są dwie proste reguły związane z wyjątkami:

  • konstruktory mogą zgłaszać wyjątki (to jedyny sposób na sygnalizację że się nie powiodły)
  • destruktory nigdy nie powinny zgłaszać wyjątków (*DSNTE)

Jest jeden specjalny model obsługi wyjątków : SEH (Structured Exception Handling). Jest to model specyficzny dla Windows i jest używany do wyjątków sprzętowych (błędy tego typu mogą być również zgłaszane programowo). Możesz je obsłużyć np. jeśli chcesz przechwycić błąd wyłuskania wskaźników o wartości NULL.

Aby pokazać/zalogować sekwencję operacji wykonaną do momentu zgłoszenia wyjątku zobacz zasoby "Stack trace". Opisują jak pokazać stos wywołań podobny do Javowego exception.printStackTrace().

DSNTE

Materiały wprowadzające

FAQ

Eseje - kiedy używać wyjątków

Wyjątki i destruktory

throw, nothrow, noexcept, is_nothrow_aaa

C++11

Boost

  • Boost Exception - przesyłania dodatkowej informacji do kodu handlera wyjątku

Structured Exception Handling

Stack trace

Linux/Windows

Linux

Windows

Uniwersalne rozwiązania bazujące na śledzeniu

Inne triki

Zobacz równiez

Udostępnij

obserwuj