Menu
Coddy logo textTech

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의 구체적인 세부 정보에 액세스할 수 없지만, 일반적인 오류 메시지를 제공하고 정리 작업을 수행하여 프로그램이 원활하게 계속 실행되도록 할 수 있습니다.

challenge icon

챌린지

쉬움

catch-all 핸들러를 포함한 여러 catch 블록을 사용하여 포괄적인 예외 처리를 보여 주는 프로그램을 작성하세요. 이 과제에서는 특정 예외 유형과 미리 정의된 범주에 속하지 않는 예기치 않은 오류를 모두 처리하는 방법에 대한 이해도를 평가합니다.

다음 입력이 제공됩니다:

  • 수행할 테스트 유형을 나타내는 문자열 testType ("string_convert", "math_operation", "array_access" 또는 "unknown_error")
  • 연산의 기본 데이터로 사용될 문자열 value1
  • 일부 연산에서 보조 데이터로 사용될 문자열 value2

프로그램은 다음을 수행해야 합니다:

  1. 세 개의 문자열 매개변수를 받는 performTest라는 이름의 함수를 작성합니다.
  2. 함수 내부에서 서로 다른 테스트 유형을 처리하기 위해 if-else 구조를 사용합니다.
  3. testType이 "string_convert"인 경우: std::stoi를 사용하여 value1을 정수로 변환하고 출력합니다.
  4. testType이 "math_operation"인 경우: std::stoi를 사용하여 value1과 value2를 모두 정수로 변환한 다음, value1을 value2로 나누고 결과를 출력합니다.
  5. testType이 "array_access"인 경우: 문자열 "Programming"을 생성하고, std::stoi를 사용하여 value1을 정수 index로 변환한 다음, str.at(index)를 사용하여 해당 index의 문자를 접근하고 출력합니다. .at() 메서드는 index가 invalid할 경우 자동으로 std::out_of_range를 발생시키므로 수동으로 범위를 확인할 필요가 없습니다.
  6. testType이 "unknown_error"인 경우: 정수 값 999를 throw합니다.
  7. main 함수에서 try 블록 내부에서 performTest를 호출합니다.
  8. 다음과 정확히 같은 순서로 예외를 처리하기 위해 여러 catch 블록을 사용합니다.
  9. 첫 번째: invalid 문자열-숫자 변환을 위한 std::invalid_argument&
  10. 두 번째: 너무 large한 숫자 또는 문자열 index 범위를 벗어난 경우를 위한 std::out_of_range&
  11. 세 번째: 그 밖의 모든 예외 유형을 위한 catch-all 핸들러인 catch(...)

다음의 정확한 출력 형식을 사용하세요:

성공적인 연산의 경우:

Success: [result_value]

서로 다른 예외 유형의 경우:

Invalid argument caught
Out of range caught
Unknown exception caught

C++는 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;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직과 흐름의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러