Udostępnij za pośrednictwem


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

C++ umożliwia wyrzucanie wyjątków dowolnego typu, jednak ogólnie zaleca się wyrzucanie wyjątków o typie, który dziedziczy po std::exception.Wyjątek C++ można przechwycić za pomocą catch, który określa ten sam typ co wyrzucony wyjątek lub który przechwytuje wyjątek dowolnego typu.

Jeśli typ wyrzuconego wyjątku to klasa, która posiada również klasę bazową (lub klasy) wyjątek może zostać przechwycony przez obsługę zdarzenia, która 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 zostanie przechwycony przez odwołanie, jest powiązany z rzeczywistym wyrzuconym obiektem wyjątku; w przeciwnym razie jest kopią (prawie tak samo jak argument do funkcji).

Gdy wyjątek jest wyrzucany może zostać przechwycony przez następujące typy obsługi zdarzenia catch:

  • Program obsługi, który może akceptować dowolne typy wyjątków (przy użyciu składni wielokropka).

  • Program obsługi, który akceptuje te same typy wyjątków co obiekt wyjątku; ponieważ jest to kopia modyfikatory const i volatile są ignorowane.

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

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

  • Program obsługi, który akceptuje klasę bazową tego samego typu co obiekt wyjątku; ponieważ jest to kopia, modyfikatory const i volatile są ignorowane.Obsługa zdarzenia catch dla klasy bazowej nie może poprzedzać obsługi zdarzenia catch dla klasy pochodnej.

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

  • Program obsługi, który akceptuje odwołanie do const lub volatile klasy bazowej 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 pojawiają się programy obsługi catch jest istotna, ponieważ programy obsługi dla danego bloku try są badane są w kolejności ich występowania.Na przykład błędem jest umieszczenie programu obsługi dla klasy bazowej przed programem obsługi dla klasy pochodnej.Gdy zostanie znaleziony pasujący program obsługi zdarzenia catch, kolejne programy obsługi nie będą badane.W efekcie program obsługi catch w postaci wielokropka musi być ostatnim programem obsługi dla jego bloku catch.Na 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 program obsługi catch w postaci wielokropka jest jedynym programem obsługi, który jest badany.

Zobacz też

Informacje

Obsługa wyjątków języka C++