기본 개념을 사용 하 여 예외 관리
이 항목에서는 관리 되는 응용 프로그램에서 예외 처리에 대해 설명 합니다.즉, 사용 하 여 컴파일한 응용 프로그램은 /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 );
}
}
}
Output
In 'catch(CMyClass& catchC)'
2
In 'catch(MyStruct^ catchException)'
11
C + + 개체 해제 순서
Throw 함수 처리 함수 사이의 런타임 스택에 될 수 있는 소멸자와 C++ 개체 해제가 발생 합니다.CLR 형식은 힙에 할당 되어 있으므로 해제 하 여 적용 되지 않습니다.
Throw 된 예외에 대 한 이벤트의 순서는 다음과 같습니다.
런타임 스택의 적절 한 catch 절에서 나는 SEH를 찾는 안내는 SEH 예외를 catch 할 수, 필터 제외 합니다.Catch 절 어휘 순서에서 먼저 검색 되 고 동적으로 우선 호출 스택.
올바른 처리기가 발견 되 면 스택에 해당 지점에 해제 됩니다.스택의 각 함수 호출에 대 한 로컬 개체 소멸 되 고 __finally 블록, 대부분에서 실행 됩니다 바깥쪽으로 중첩 합니다.
스택이 해제 되 면 catch 절이 실행 됩니다.
관리 되지 않는 형식을 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.