Sposób oceniania bloków Catch (C++)

C++ umożliwia wyrzucanie wyjątków dowolnego typu, jednak ogólnie zaleca się wyrzucanie typów, który pochodzą od std::exception. Wyjątek C++ może przechwycić catch program obsługi, który określa ten sam typ co zgłoszony wyjątek lub przez program obsługi, który może przechwytywać dowolny typ wyjątku.

Jeśli typ wyrzuconego wyjątku to klasa, która posiada również klasę bazową (lub klasy) wyjątek może zostać przechwycony przez program obsługi, który akceptuje klasy bazowe typu wyjątku, jak również odwołania do klasy bazowej typu wyjątku. Należy zauważyć, że gdy wyjątek zostaje przechwycony przez odwołanie, następuje jego powiązanie z rzeczywistym wyrzuconym obiektem wyjątku; w przeciwnym razie jest kopią (prawie tak samo jak argument do funkcji).

Po wystąpieniu wyjątku może zostać przechwycony przez następujące typy catch procedur obsługi:

  • Program obsługi, który może akceptować dowolny typ (przy użyciu składni wielokropka).

  • Procedura obsługi akceptująca ten sam typ co obiekt wyjątku; ponieważ jest to kopia, const a volatile modyfikatory są ignorowane.

  • Program obsługi, który akceptuje odwołanie do tego samego typu co obiekt wyjątku.

  • Procedura obsługi, która akceptuje odwołanie do typu const lub volatile tego samego typu co obiekt wyjątku.

  • Procedura obsługi akceptująca klasę bazową tego samego typu co obiekt wyjątku; ponieważ jest to kopia, const a volatile modyfikatory są ignorowane. Procedura catch obsługi dla klasy bazowej nie może poprzedzać catch procedury obsługi dla klasy pochodnej.

  • Program obsługi, który akceptuje odwołanie do klasy bazowej tego samego typu co obiekt wyjątku.

  • Procedura obsługi akceptująca odwołanie do const klasy bazowej lub volatile tego samego typu co obiekt wyjątku.

  • Program obsługi, który akceptuje wskaźnik, do którego można przekonwertować wyrzucony obiekt wskaźnika za pomocą standardowych reguł konwersji wskaźnika.

Kolejność, w której catch pojawiają się programy obsługi, jest znacząca, ponieważ programy obsługi dla danego try bloku są badane w kolejności ich wyglądu. Na przykład, błędem jest umieszczenie programu obsługi dla klasy bazowej przed programem obsługi dla klasy pochodnej. Po znalezieniu zgodnej catch procedury obsługi kolejne programy obsługi nie są badane. W związku z tym procedura obsługi wielokropka catch musi być ostatnią procedurą obsługi bloku try . Przykład:

// ...
try
{
    // ...
}
catch( ... )
{
    // Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
    cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
    // Handle CExcptClass exception here.
}

W tym przykładzie procedura obsługi wielokropka catch jest jedyną badaną procedurą obsługi.

Zobacz też

Nowoczesne najlepsze rozwiązania dotyczące języka C++ dotyczące wyjątków i obsługi błędów