다음을 통해 공유


기본 개념을 사용 하 여 예외 관리

이 항목에서는 관리 되는 응용 프로그램에서 예외 처리에 대해 설명 합니다.즉, 사용 하 여 컴파일한 응용 프로그램은 /clr 컴파일러 옵션.

항목 내용

  • /Clr에서 예외를 throw합니다.

  • 블록에 대 한 CLR 확장 try/Catch

설명

로 컴파일하는 경우는 /clr 옵션을 표준 뿐만 아니라 CLR 예외를 처리할 수 있는 C++ 예외 처리구조적된 예외 처리 (SEH).CLR 예외는 관리 되는 형식에 의해 throw 된 예외가입니다.System::Exception 클래스 CLR 예외 처리에 대 한 많은 유용한 메서드를 제공 하며 사용자 정의 예외 클래스를 기본 클래스로 권장 됩니다.

인터페이스에서 파생 되는 예외 형식을 catch 하는 것은 지원 되지 않습니다 아래 /clr.또한 공용 언어 런타임 스택 오버플로 예외를 catch 하려면 허용 하지 않습니다. 스택 오버플로 예외는 프로세스를 종료 합니다.

관리 되는 기능과 관리 되지 않는 응용 프로그램에서 예외 처리 차이점에 대 한 자세한 내용은 참조 하십시오. 차이 예외 처리 동작에서 Managed Extensions for C++의.

/Clr에서 예외를 throw합니다.

C + + throw 식이 CLR 형식으로 핸들을 throw 하도록 확장 됩니다.다음 예제는 사용자 지정 예외 형식을 만든 및 다음 해당 형식의 인스턴스를 throw 됩니다.

// clr_exception_handling.cpp
// compile with: /clr /c
ref struct MyStruct: public System::Exception {
public:
   int i;
};

void GlobalFunction() {
   MyStruct^ pMyStruct = gcnew MyStruct;
   throw pMyStruct;
}

발생 하기 전에 값 형식을 boxing 해야 합니다.

// clr_exception_handling_2.cpp
// compile with: /clr /c
value struct MyValueStruct {
   int i;
};

void GlobalFunction() {
   MyValueStruct v = {11};
   throw (MyValueStruct ^)v;
}

블록에 대 한 CLR 확장 try/Catch

동일한 시도/catch CLR 및 네이티브 예외를 모두 catch 할 블록 구조를 사용할 수 있습니다.

// clr_exception_handling_3.cpp
// compile with: /clr
using namespace System;
ref struct MyStruct : public Exception {
public:
   int i;
};

struct CMyClass {
public:
   double d;
};

void GlobalFunction() {
   MyStruct^ pMyStruct = gcnew MyStruct;
   pMyStruct->i = 11;
   throw pMyStruct;
}

void GlobalFunction2() {
   CMyClass c = {2.0};
   throw c;
}

int main() {
   for ( int i = 1; i >= 0; --i ) {
      try {
         if ( i == 1 )
            GlobalFunction2();
         if ( i == 0 )
            GlobalFunction();
      }
      catch ( CMyClass& catchC ) {
         Console::WriteLine( "In 'catch(CMyClass& catchC)'" );
         Console::WriteLine( catchC.d );
      }
      catch ( MyStruct^ catchException ) {
         Console::WriteLine( "In 'catch(MyStruct^ catchException)'" );
         Console::WriteLine( catchException->i );
      }
   }
}

df24ysb6.collapse_all(ko-kr,VS.110).gifOutput

In 'catch(CMyClass& catchC)'
2
In 'catch(MyStruct^ catchException)'
11

df24ysb6.collapse_all(ko-kr,VS.110).gifC + + 개체 해제 순서

Throw 함수 처리 함수 사이의 런타임 스택에 될 수 있는 소멸자와 C++ 개체 해제가 발생 합니다.CLR 형식은 힙에 할당 되어 있으므로 해제 하 여 적용 되지 않습니다.

Throw 된 예외에 대 한 이벤트의 순서는 다음과 같습니다.

  1. 런타임 스택의 적절 한 catch 절에서 나는 SEH를 찾는 안내는 SEH 예외를 catch 할 수, 필터 제외 합니다.Catch 절 어휘 순서에서 먼저 검색 되 고 동적으로 우선 호출 스택.

  2. 올바른 처리기가 발견 되 면 스택에 해당 지점에 해제 됩니다.스택의 각 함수 호출에 대 한 로컬 개체 소멸 되 고 __finally 블록, 대부분에서 실행 됩니다 바깥쪽으로 중첩 합니다.

  3. 스택이 해제 되 면 catch 절이 실행 됩니다.

df24ysb6.collapse_all(ko-kr,VS.110).gif관리 되지 않는 형식을 catch 하는 것

관리 되지 않는 개체 형식을 throw 되 면 형식의 예외로 래핑된 System::Runtime.InteropServices::SEHException.적절 한 항목을 검색할 때 catch 절, 두 가지 가능성이 있습니다.

  • 네이티브 C++ 형식이 발견 되 면 예외 래핑이 해제 이므로 해당 형식과 비교 합니다.이 비교는 네이티브 C++ 형식을 일반적인 방법으로 catch 할 수 있습니다.

  • 그러나 경우에 catch 형식의 절 SEHException 또는 해당 기본 클래스 중 하나입니다 검사 먼저, 절 예외를 가로챌 수 있습니다.따라서 모든 catch 절 CLR 형식의 전에 네이티브 C++ 형식을 먼저 catch 하는 모든 catch 절을 배치 해야 합니다.

    catch(Object^)

catch(...)

SEH 예외를 포함 하 여 모든 발생된 종류를 모두 catch 합니다.

않는 형식을 catch(object^)에 의해 catch 되지 않으면 throw 된 개체를 삭제 하지 않습니다.

예외를 throw 하거나 catch 하는 것을 않는 때 사용 하는 것이 좋습니다의 /EHsc 컴파일러 옵션 대신 /EHs 또는 /EHa.

참고 항목

참조

safe_cast(C++ 구성 요소 확장)

Visual C++에서는 처리 된 예외

기타 리소스

예외 처리(C++ 구성 요소 확장)