Catch-All 핸들러
Coddy C++ 여정의 로직과 흐름 섹션에 포함된 레슨. 56개 중 52번째.
때때로 프로그램에서 계획한 특정 예외 유형에 맞지 않는 예기치 않은 오류가 발생할 수 있습니다. 포괄 처리기 catch(...)는 더 구체적인 catch 블록에서 처리되지 않은 모든 예외를 포착하는 안전망을 제공합니다.
모든 예외를 처리하는 핸들러는 특정 예외 유형을 지정하는 대신 세 개의 점 (...)을 사용합니다. C++는 catch 블록을 순서대로 확인하므로 다른 모든 catch 블록 뒤에 배치해야 합니다.
try {
// 다양한 예외를 발생시킬 수 있는 코드
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}catch-all 처리기는 이전 blocks에서 포착되지 않은 모든 예외 유형에 대한 대체 역할을 합니다. 이는 예상하지 못한 예외를 throw할 수 있는 코드로 작업할 때 특히 유용하며, 예기치 않은 오류로 인해 프로그램이 중단되지 않도록 합니다.
catch-all 블록에서는 exception의 구체적인 세부 정보에 액세스할 수 없지만, 일반적인 오류 메시지를 제공하고 정리 작업을 수행하여 프로그램이 원활하게 계속 실행되도록 할 수 있습니다.
챌린지
쉬움catch-all 핸들러를 포함한 여러 catch 블록을 사용하여 포괄적인 예외 처리를 보여 주는 프로그램을 작성하세요. 이 과제에서는 특정 예외 유형과 미리 정의된 범주에 속하지 않는 예기치 않은 오류를 모두 처리하는 방법에 대한 이해도를 평가합니다.
다음 입력이 제공됩니다:
- 수행할 테스트 유형을 나타내는 문자열
testType("string_convert","math_operation","array_access"또는"unknown_error") - 연산의 기본 데이터로 사용될 문자열
value1 - 일부 연산에서 보조 데이터로 사용될 문자열
value2
프로그램은 다음을 수행해야 합니다:
- 세 개의 문자열 매개변수를 받는
performTest라는 이름의 함수를 작성합니다. - 함수 내부에서 서로 다른 테스트 유형을 처리하기 위해 if-else 구조를 사용합니다.
- testType이
"string_convert"인 경우:std::stoi를 사용하여 value1을 정수로 변환하고 출력합니다. - testType이
"math_operation"인 경우:std::stoi를 사용하여 value1과 value2를 모두 정수로 변환한 다음, value1을 value2로 나누고 결과를 출력합니다. - testType이
"array_access"인 경우: 문자열"Programming"을 생성하고,std::stoi를 사용하여 value1을 정수 index로 변환한 다음,str.at(index)를 사용하여 해당 index의 문자를 접근하고 출력합니다..at()메서드는 index가 invalid할 경우 자동으로std::out_of_range를 발생시키므로 수동으로 범위를 확인할 필요가 없습니다. - testType이
"unknown_error"인 경우: 정수 값999를 throw합니다. - main 함수에서
try블록 내부에서performTest를 호출합니다. - 다음과 정확히 같은 순서로 예외를 처리하기 위해 여러
catch블록을 사용합니다. - 첫 번째: invalid 문자열-숫자 변환을 위한
std::invalid_argument& - 두 번째: 너무 large한 숫자 또는 문자열 index 범위를 벗어난 경우를 위한
std::out_of_range& - 세 번째: 그 밖의 모든 예외 유형을 위한 catch-all 핸들러인
catch(...)
다음의 정확한 출력 형식을 사용하세요:
성공적인 연산의 경우:
Success: [result_value]서로 다른 예외 유형의 경우:
Invalid argument caught
Out of range caught
Unknown exception caughtC++는 catch 블록을 순서대로 확인하므로 catch-all 핸들러인 catch(...)는 반드시 마지막에 배치해야 합니다. 이 핸들러는 앞의 특정 catch 블록에서 처리되지 않은 모든 예외 유형을 처리하며, 여기에는 "unknown_error" 사례에서 발생한 정수 예외도 포함됩니다. catch-all 핸들러는 알려진 예외 유형에 대해서는 구체적인 처리를 계속 수행하면서 예기치 않은 오류에 대한 안전망을 제공합니다.
직접 해보기
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: 여기에 코드를 작성하세요 - performTest 함수를 생성하세요
int main() {
// 입력 읽기
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: 아래에 코드를 작성하세요 - try-catch 블록을 구현하고 performTest를 호출하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직과 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러