Try, Throw 및 Catch 문(C++)
C++에서 예외 처리를 구현하려면 , throw
및 catch
식을 사용합니다try
.
먼저 블록을 사용하여 예외를 try
throw할 수 있는 하나 이상의 문을 묶습니다.
식은 throw
예외 조건(종종 오류)이 블록에서 발생했음을 알 수 있습니다 try
. 식의 피연산자로 모든 형식의 개체를 throw
사용할 수 있습니다. 일반적으로 이 개체는 일반적으로 오류 정보를 전달하는 데 사용됩니다. 대부분의 경우 표준 라이브러리에 std::exception
정의된 클래스 또는 파생 클래스 중 하나를 사용하는 것이 좋습니다. 해당 중 하나가 적절 std::exception
하지 않은 경우 .
throw될 수 있는 예외를 처리하려면 블록 바로 다음에 try
하나 이상의 catch
블록을 구현합니다. 각 catch
블록은 처리할 수 있는 예외 유형을 지정합니다.
이 예제에서는 try
블록 및 해당 처리기를 보여 줍니다. GetNetworkResource()
가 네트워크 연결을 통해 데이터를 받고 두 개의 예외 형식은 std::exception
에서 파생된 사용자 정의 클래스라고 가정합니다. 예외는 문에서 참조로 const
catch
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 블록 평가 방법을 참조하세요. 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
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기