Menu
CoddyTech

Catch-All 핸들러

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

때때로 프로그램은 계획해 둔 특정 예외 유형에 해당하지 않는 예상치 못한 오류를 만날 수 있습니다. 포괄 처리기 catch(...)는 더 구체적인 catch 블록에서 처리하지 않은 모든 예외를 잡아내는 안전망을 제공합니다.

모든 예외를 처리하는 핸들러는 특정 예외 유형을 지정하는 대신 세 개의 점 (...)을 사용합니다. C++는 핸들러를 순서대로 확인하므로 다른 모든 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 핸들러는 이전 블록에서 잡히지 않은 모든 예외 유형에 대한 대체 처리기로 작동합니다. 예상하지 못한 예외가 발생할 수 있는 코드로 작업할 때 특히 유용하며, 예기치 않은 오류로 인해 프로그램이 충돌하지 않도록 합니다.

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

challenge icon

챌린지

쉬움

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

다음 입력이 제공됩니다.

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

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

  1. 문자열 매개변수 3개를 받는 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를 던집니다.
  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 블록에서 처리되지 않은 모든 예외 유형을 처리합니다. 모든 예외를 처리하는 핸들러는 알려진 예외 유형을 구체적으로 처리하면서도 예기치 않은 오류에 대비하는 안전망 역할을 합니다.

직접 해보기

#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++ 컴파일러