Try, Throw 및 Catch 문(C++)try, throw, and catch Statements (C++)

C + +에서 예외 처리를 구현 하려면 try , throwcatch 식을 사용 합니다.To implement exception handling in C++, you use try, throw, and catch expressions.

먼저 블록을 사용 try 하 여 예외를 throw 할 수 있는 하나 이상의 문을 묶습니다.First, use a try block to enclose one or more statements that might throw an exception.

throw 식은 예외 조건 (종종 오류)을 블록에서 발생 했다는 신호를 보냅니다 try .A throw expression signals that an exceptional condition—often, an error—has occurred in a try block. 모든 형식의 개체를 식의 피연산자로 사용할 수 있습니다 throw .You can use an object of any type as the operand of a throw expression. 일반적으로 이 개체는 일반적으로 오류 정보를 전달하는 데 사용됩니다.Typically, this object is used to communicate information about the error. 대부분의 경우 std:: exception 클래스 또는 표준 라이브러리에 정의 된 파생 클래스 중 하나를 사용 하는 것이 좋습니다.In most cases, we recommend that you use the std::exception class or one of the derived classes that are defined in the standard library. 그 중 하나가 적합하지 않은 경우 std::exception에서 사용자 고유의 예외를 파생하는 것이 좋습니다.If one of those is not appropriate, we recommend that you derive your own exception class from std::exception.

Throw 될 수 있는 예외를 처리 하려면 catch 블록 바로 다음에 하나 이상의 블록을 구현 try 합니다.To handle exceptions that may be thrown, implement one or more catch blocks immediately following a try block. catch 블록은 처리할 수 있는 예외 형식을 지정 합니다.Each catch block specifies the type of exception it can handle.

이 예제에서는 try 블록 및 해당 처리기를 보여 줍니다.This example shows a try block and its handlers. GetNetworkResource()가 네트워크 연결을 통해 데이터를 받고 두 개의 예외 형식은 std::exception에서 파생된 사용자 정의 클래스라고 가정합니다.Assume that GetNetworkResource() acquires data over a network connection and that the two exception types are user-defined classes that derive from std::exception. 예외는 문에서 참조로 catch 됩니다 const catch .Notice that the exceptions are caught by const reference in the catch statement. 값으로 예외를 throw하고 상수 참조로 catch하는 것이 좋습니다.We recommend that you throw exceptions by value and catch them by const reference.

예제Example

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");
   // ...
}

설명Remarks

절 뒤의 코드는 try 보호 된 코드 섹션입니다.The code after the try clause is the guarded section of code. throw 식은 예외 를 발생 시킵니다.The throw expression throws—that is, raises—an exception. 절 뒤에 오는 코드 블록은 catch 예외 처리기입니다.The code block after the catch clause is the exception handler. 및 식의 형식이 throw catch 호환 되는 경우 throw 되는 예외를 catch 하는 처리기입니다.This is the handler that catches the exception that's thrown if the types in the throw and catch expressions are compatible. 블록에서 형식 일치를 제어 하는 규칙 목록은 catch Catch 블록을 평가 하는 방법을 참조 하세요.For a list of rules that govern type-matching in catch blocks, see How Catch Blocks are Evaluated. catch 문이 형식 대신 줄임표 (...)를 지정 하는 경우 catch 블록은 모든 형식의 예외를 처리 합니다.If the catch statement specifies an ellipsis (...) instead of a type, the catch block handles every type of exception. /Eha 옵션을 사용 하 여 컴파일하면 C 구조적 예외 및 시스템 생성 또는 응용 프로그램에서 생성 된 비동기 예외 (예: 메모리 보호, 0으로 나누기 및 부동 소수점 위반)가 포함 될 수 있습니다.When you compile with the /EHa option, these can include C structured exceptions and system-generated or application-generated asynchronous exceptions such as memory protection, divide-by-zero, and floating-point violations. catch 블록은 일치 하는 형식을 찾기 위해 프로그램 순서로 처리 되기 때문에 줄임표 처리기는 연결 된 블록의 마지막 처리기 여야 합니다 try .Because catch blocks are processed in program order to find a matching type, an ellipsis handler must be the last handler for the associated try block. catch(...)를 주의해서 사용하십시오. catch 블록이 catch되는 특정 예외를 처리하는 방법을 알고 있는 경우가 아니면 프로그램을 계속 실행하지 마십시오.Use catch(...) with caution; do not allow a program to continue unless the catch block knows how to handle the specific exception that is caught. 일반적으로 catch(...) 블록은 오류를 기록하고 프로그램 실행을 중지하기 전에 특별한 정리 작업을 수행하는 데 사용합니다.Typically, a catch(...) block is used to log errors and perform special cleanup before program execution is stopped.

throw 피연산자가 없는 식은 현재 처리 되 고 있는 예외를 다시 throw 합니다.A throw expression that has no operand re-throws the exception currently being handled. 예외를 다시 throw할 때 원래 예외의 다형 형식 정보를 보존하므로 이 폼을 사용하는 것이 좋습니다.We recommend this form when re-throwing the exception, because this preserves the original exception’s polymorphic type information. 이러한 식은 처리기 catch 또는 처리기에서 호출 되는 함수 에서만 사용 해야 합니다 catch .Such an expression should only be used in a catch handler or in a function that's called from a catch handler. 다시 throw된 예외 개체는 복사본이 아닌 원본 예외 개체입니다.The re-thrown exception object is the original exception object, not a copy.

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;
}

참고 항목See also

예외 및 오류 처리에 대 한 최신 c + + 모범 사례Modern C++ best practices for exceptions and error handling
키워드Keywords
처리 되지 않은 c + + 예외Unhandled C++ Exceptions
__uncaught_exception__uncaught_exception