Sposób oceniania bloków Catch (C++)How Catch Blocks are Evaluated (C++)

C++ umożliwia wyrzucanie wyjątków dowolnego typu, jednak ogólnie zaleca się wyrzucanie typów, który pochodzą od std::exception.C++ enables you to throw exceptions of any type, although in general it is recommended to throw types that are derived from std::exception. Wyjątek może być przechwytywany przez procedurę obsługi catch, która określa ten sam typ co zgłoszony wyjątek lub przez program obsługi, który może przechwytywać dowolny typ wyjątku. C++A C++ exception can be caught by a catch handler that specifies the same type as the thrown exception, or by a handler that can catch any type of exception.

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.If the type of thrown exception is a class, which also has a base class (or classes), it can be caught by handlers that accept base classes of the exception's type, as well as references to bases of the exception's type. 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).Note that when an exception is caught by a reference, it is bound to the actual thrown exception object; otherwise, it is a copy (much the same as an argument to a function).

Gdy wyjątek jest zgłaszany, może być przechwycony przez następujące typy obsługi catch :When an exception is thrown, it may be caught by the following types of catch handlers:

  • Program obsługi, który może akceptować dowolny typ (przy użyciu składni wielokropka).A handler that can accept any type (using the ellipsis syntax).

  • Program obsługi, który akceptuje ten sam typ co obiekt wyjątku; ponieważ jest to kopia, Modyfikatory const i volatile są ignorowane.A handler that accepts the same type as the exception object; because it is a copy, const and volatile modifiers are ignored.

  • Program obsługi, który akceptuje odwołanie do tego samego typu co obiekt wyjątku.A handler that accepts a reference to the same type as the exception object.

  • Program obsługi, który akceptuje odwołanie do formy const lub volatile tego samego typu co obiekt wyjątku.A handler that accepts a reference to a const or volatile form of the same type as the exception object.

  • 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.A handler that accepts a base class of the same type as the exception object; since it is a copy, const and volatile modifiers are ignored. Procedura obsługi catch dla klasy bazowej nie może poprzedzać obsługi catch dla klasy pochodnej.The catch handler for a base class must not precede the catch handler for the derived class.

  • Program obsługi, który akceptuje odwołanie do klasy bazowej tego samego typu co obiekt wyjątku.A handler that accepts a reference to a base class of the same type as the exception object.

  • Program obsługi, który akceptuje odwołanie do formy const lub volatile klasy bazowej tego samego typu co obiekt wyjątku.A handler that accepts a reference to a const or volatile form of a base class of the same type as the exception object.

  • 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.A handler that accepts a pointer to which a thrown pointer object can be converted via standard pointer conversion rules.

Kolejność, w jakiej są wyświetlane programy obsługi catch , jest istotna, ponieważ programy obsługi danego bloku try są badane w kolejności ich występowania.The order in which catch handlers appear is significant, because handlers for a given try block are examined in order of their appearance. Na przykład, błędem jest umieszczenie programu obsługi dla klasy bazowej przed programem obsługi dla klasy pochodnej.For example, it is an error to place the handler for a base class before the handler for a derived class. Po znalezieniu pasującej obsługi catch nie są badane kolejne programy obsługi.After a matching catch handler is found, subsequent handlers are not examined. W związku z tym program obsługi catch w postaci wielokropka musi być ostatnim programem obsługi dla jego bloku try .As a result, an ellipsis catch handler must be the last handler for its try block. Na przykład:For example:

// ...
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 catch w postaci wielokropka jest jedyną zbadaną obsługą.In this example, the ellipsis catch handler is the only handler that is examined.

Zobacz takżeSee also

Nowoczesne C++ najlepsze rozwiązania dotyczące wyjątków i obsługi błędówModern C++ best practices for exceptions and error handling