Try, Throw 및 Catch 문(C++)

C++에서 예외 처리를 구현하려면 , throwcatch 식을 사용합니다try.

먼저 블록을 사용하여 예외를 try throw할 수 있는 하나 이상의 문을 묶습니다.

식은 throw 예외 조건(종종 오류)이 블록에서 발생했음을 알 수 있습니다 try . 식의 피연산자로 모든 형식의 개체를 throw 사용할 수 있습니다. 일반적으로 이 개체는 일반적으로 오류 정보를 전달하는 데 사용됩니다. 대부분의 경우 표준 라이브러리에 std::exception 정의된 클래스 또는 파생 클래스 중 하나를 사용하는 것이 좋습니다. 해당 중 하나가 적절 std::exception하지 않은 경우 .

throw될 수 있는 예외를 처리하려면 블록 바로 다음에 try 하나 이상의 catch 블록을 구현합니다. 각 catch 블록은 처리할 수 있는 예외 유형을 지정합니다.

이 예제에서는 try 블록 및 해당 처리기를 보여 줍니다. GetNetworkResource()가 네트워크 연결을 통해 데이터를 받고 두 개의 예외 형식은 std::exception에서 파생된 사용자 정의 클래스라고 가정합니다. 예외는 문에서 참조로 constcatch catch됩니다. 값으로 예외를 throw하고 상수 참조로 catch하는 것이 좋습니다.

예시

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

설명

절 뒤의 try 코드는 코드의 보호된 섹션입니다. 식throw throw됩니다. 즉, 예외가 발생합니다. 절 뒤의 catch 코드 블록은 예외 처리기입니다. 식의 형식이 호환되는 경우 throw되는 예외를 catch 하는 throwcatch 처리기입니다. 블록에서 형식 일치 catch 를 제어하는 규칙 목록은 Catch 블록 평가 방법을 참조하세요. catch 문이 형식 대신 줄임표(...)를 지정하는 경우 블록은 catch 모든 유형의 예외를 처리합니다. 옵션을 사용하여 /EHa 컴파일하는 경우 C 구조적 예외와 메모리 보호, 0으로 나누기 및 부동 소수점 위반과 같은 시스템 생성 또는 애플리케이션에서 생성된 비동기 예외를 포함할 수 있습니다. catch 블록은 일치하는 형식을 찾기 위해 프로그램 순서로 처리되므로 줄임표 처리기는 연결된 try 블록의 마지막 처리기여야 합니다. 주의해서 사용 catch(...) 하세요. catch 블록이 catch된 특정 예외를 처리하는 방법을 알지 않는 한 프로그램을 계속하도록 허용하지 마세요. 일반적으로 catch(...) 블록은 오류를 기록하고 프로그램 실행을 중지하기 전에 특별한 정리 작업을 수행하는 데 사용합니다.

throw 피연산자 없는 식은 현재 처리 중인 예외를 다시 throw합니다. 원래 예외의 다형 형식 정보가 유지되므로 예외를 다시 throw할 때 이 양식을 사용하는 것이 좋습니다. 이러한 식은 처리기 또는 처리기에서 호출되는 함수에서 catch 만 사용해야 catch 합니다. 다시 throw된 예외 개체는 복사본이 아니라 원래 예외 개체입니다.

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

참고 항목

예외 및 오류 처리에 대한 최신 C++ 모범 사례
키워드
처리되지 않은 C++ 예외
__uncaught_exception