Menu
Coddy logo textTech

Catch-All 핸들러

Coddy C++ 여정의 로직과 흐름 섹션에 포함된 레슨 — 56개 중 52번째.

때때로 프로그램은 계획했던 특정 예외 유형에 맞지 않는 예기치 않은 오류를 만날 수 있습니다. 모든 예외를 처리하는 핸들러인 catch(...)는 더 구체적인 catch 블록에서 처리되지 않은 모든 예외를 잡는 안전망을 제공합니다.

모든 예외를 처리하는 처리기(catch-all handler)는 특정 예외 유형을 지정하는 대신 세 개의 점 (...)을 사용합니다. C++은 catch 블록을 순서대로 확인하므로, 이 처리기는 반드시 다른 모든 catch 블록 뒤에 위치해야 합니다:

try {
    // Code that might throw various exceptions
} 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 핸들러는 이전 블록에서 처리되지 않은 모든 예외 유형에 대한 대비책 역할을 합니다. 이는 예상하지 못한 예외를 발생시킬 수 있는 코드를 다룰 때 특히 유용하며, 예기치 않은 오류로 인해 프로그램이 중단되지 않도록 보장합니다.

catch-all 블록에서는 예외의 구체적인 세부 정보에 접근할 수 없지만, 여전히 일반적인 오류 메시지를 제공하고 프로그램이 원활하게 계속 실행되도록 정리 작업을 수행할 수 있습니다.

challenge icon

챌린지

쉬움

범용 핸들러를 포함한 여러 개의 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을 정수 인덱스로 변환한 다음, str.at(index)를 사용하여 해당 인덱스의 문자에 접근하고 출력합니다. .at() 메서드는 인덱스가 유효하지 않은 경우 자동으로 std::out_of_range를 던지므로 수동으로 범위를 확인할 필요가 없습니다.
  6. testType이 "unknown_error"인 경우: 정수 값 999를 throw합니다.
  7. main 함수에서 try 블록 내부의 performTest를 호출합니다.
  8. 정확히 다음 순서대로 여러 catch 블록을 사용하여 예외를 처리합니다:
  9. 첫 번째: 잘못된 문자열-숫자 변환을 위한 std::invalid_argument&
  10. 두 번째: 너무 큰 숫자 또는 문자열 인덱스 범위를 벗어난 경우를 위한 std::out_of_range&
  11. 세 번째: 다른 모든 예외 유형을 처리하기 위한 범용 핸들러인 catch(...)

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

성공적인 연산의 경우:

Success: [result_value]

다양한 예외 유형의 경우:

Invalid argument caught
Out of range caught
Unknown exception caught

C++은 catch 블록을 순서대로 확인하므로 범용 핸들러인 catch(...)는 반드시 마지막에 배치해야 함을 기억하세요. 이 핸들러는 "unknown_error" 사례에서 던져진 정수 예외를 포함하여 이전의 특정 catch 블록에서 처리되지 않은 모든 예외 유형을 포착합니다. 범용 핸들러는 알려진 예외 유형에 대한 특정 처리를 허용하면서도 예기치 않은 오류에 대한 안전망을 제공합니다.

치트 시트

포괄적 처리기(catch-all handler)인 catch(...)는 특정 catch 블록에서 처리되지 않은 모든 예외를 포착하는 안전망 역할을 합니다.

포괄적 처리기는 세 개의 점 (...)을 사용하며, C++은 catch 블록을 순서대로 확인하므로 반드시 다른 모든 catch 블록 뒤에 배치해야 합니다.

try {
    // Code that might throw various exceptions
} 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;
}

포괄적 처리기는 이전 블록에서 포착되지 않은 모든 예외 유형에 대한 대체 수단(fallback)으로 작동합니다. 포괄적 처리 블록 내에서는 구체적인 예외 세부 정보에 접근할 수 없지만, 일반적인 오류 메시지를 제공하고 정리 작업을 수행할 수 있습니다.

직접 해보기

#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실력 점검

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

로직과 흐름의 모든 레슨