다음을 통해 공유


Try, Throw 및 Catch 문(C++)

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

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

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

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

이 예제에서는 try 블록과 해당 처리기를 보여 줍니다. GetNetworkResource()가 네트워크 연결을 통해 데이터를 받고 두 개의 예외 형식은 std::exception에서 파생된 사용자 정의 클래스라고 가정합니다. 예외는 catch 문의 const 참조를 통해 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 문의 형식이 호환되는 경우 throw되는 예외를 catch하는 처리기입니다. catch 블록에서 형식 일치를 제어하는 규칙 목록은 Catch 블록 평가 방법 (C++)를 참조하십시오. catch 문이 형식 대신 줄임표(...)를 지정하는 경우 catch 블록이 모든 형식의 예외를 처리합니다. /EHa 옵션을 사용하여 컴파일하는 경우 여기에는 메모리 보호, 0으로 나누기 및 부동 소수점 위반 등 C 구조화된 예외와 시스템에서 생성된 또는 응용 프로그램에서 생성된 비동기 예외가 포함될 수 있습니다. 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++ 키워드

처리되지 않은 C++ 예외

__uncaught_exception