Udostępnij przez


Błąd kompilatora C2316

"class_type": nie można przechwycić, ponieważ destruktor i/lub konstruktor kopiowania są niedostępne lub usunięte

Uwagi

Wyjątek został przechwycony przez wartość lub odwołanie, ale konstruktor kopiowania, operator przypisania lub oba były niedostępne.

Zmiany zgodności w programie Visual Studio 2015 sprawiły, że ten błąd był stosowany do nieprawidłowych instrukcji catch wyjątków MFC pochodzących z CExceptionelementu . Ponieważ CException ma dziedziczony konstruktor kopii prywatnej, klasa i jej pochodne nie można kopiować i nie mogą być przekazywane według wartości, co oznacza również, że nie można ich przechwycić według wartości. Instrukcje catch, które przechwyciły wyjątki MFC według wartości wcześniej doprowadziły do nieuchwyconych wyjątków w czasie wykonywania. Teraz kompilator poprawnie identyfikuje tę sytuację i zgłasza błąd C2316. Aby rozwiązać ten problem, zalecamy użycie makr TRY/CATCH MFC zamiast pisania własnych procedur obsługi wyjątków. Jeśli nie jest to odpowiednie dla kodu, zamiast tego przechwyć wyjątki MFC według odwołania.

Przykład

Poniższy przykład generuje kod C2316 i pokazuje sposób jego naprawy:

// C2316.cpp
// compile with: /EHsc
#include <stdio.h>

struct B
{
public:
    B() {}
    // Delete the following line to resolve.
private:
    // copy constructor
    B(const B&) {}
};

void f(const B&)
{
}

int main()
{
    try
    {
        B aB;
        f(aB);
    }
    catch (B b)    // C2316
    {
        printf_s("Caught an exception!\n");
    }
}