'throw' 키워드
Coddy C++ 여정의 로직과 흐름 섹션에 포함된 레슨. 56개 중 50번째.
때로는 다른 함수가 발생시킨 예외를 잡는 것뿐 아니라, 자신의 코드에서 오류가 발생했음을 알려야 할 때가 있습니다. throw 키워드를 사용하면 프로그램이 문제를 감지했을 때 예외를 직접 발생시킬 수 있습니다.
예외로 정수, 문자열 또는 사용자 지정 객체와 같은 다양한 유형의 값을 던질 수 있습니다. 기본 구문은 다음과 같습니다.
if (someErrorCondition) {
throw "Error message"; // 문자열 리터럴을 던집니다
}throw를 사용하면 프로그램은 현재 함수의 실행을 즉시 중단하고 던져진 값을 처리할 수 있는 catch 블록을 찾습니다. 이는 입력값을 검증하거나 정상적인 프로그램 실행 중에는 발생하지 않아야 하는 조건을 확인할 때 특히 유용합니다.
잘못된 입력을 감지했을 때 예외를 던지는 실용적인 예시는 다음과 같습니다.
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}호출자는 try 블록 안에 호출을 감쌉니다. 던져진 문자열 리터럴의 타입은 const char*이므로, catch 블록에는 해당 타입을 지정하며, 매개변수에는 메시지가 담깁니다:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// 출력: Error: Age cannot be negative!throw 키워드를 사용하면 프로그램에서 오류가 언제 어떻게 보고되는지 제어할 수 있으므로, 유효하지 않은 조건을 처리할 때 함수의 견고성과 예측 가능성을 높일 수 있습니다.
챌린지
쉬움잘못된 조건이 감지되었을 때 throw 키워드를 사용해 예외를 수동으로 발생시키는 입력 검증 프로그램을 작성하세요. 이 과제를 통해 직접 작성한 함수에서 오류를 알리기 위해 throw를 사용하는 방법을 이해했는지 확인합니다.
다음 입력이 제공됩니다.
- 사용자가 선택한 사용자 이름을 나타내는 문자열
username(이 줄은 비어 있을 수 있음) - 사용자의 나이를 나타내는 정수
age
프로그램은 다음을 수행해야 합니다.
- 문자열과 정수를 매개변수로 받는
validateUser라는 함수를 만듭니다. - 함수 안에서 사용자 이름이 비어 있는지(길이가 0인지) 확인합니다.
- 사용자 이름이 비어 있으면 문자열
"Username cannot be empty"를throw합니다. - 나이가 13보다 작은지 확인합니다.
- 나이가 13보다 작으면 문자열
"Age must be at least 13"을throw합니다. - 두 검증을 모두 통과하면
"User validation successful"을 출력합니다. - main 함수에서 입력값을 사용해
validateUser를 호출합니다. - 함수를 호출하는
try블록과 발생한 문자열 예외를 처리하는catch블록을 사용합니다.
다음의 정확한 출력 형식을 사용하세요.
검증에 성공한 경우:
User validation successful검증 오류가 발생한 경우:
Validation error: [error_message]throw를 사용하면 프로그램은 현재 함수의 실행을 즉시 중단하고 일치하는 catch 블록을 찾습니다. 발생한 문자열 리터럴을 처리하려면 catch 블록에서 const char* 형식을 지정해야 합니다. 첫 번째 검증이 실패하면 함수는 예외를 발생시키며 두 번째 조건을 계속 확인하지 않습니다.
직접 해보기
#include <iostream>
#include <string>
using namespace std;
// TODO: 여기 main 위에 validateUser 함수를 작성하세요
// string 타입의 username과 int 타입의 age를 받아, 검사에 실패하면 문자열 리터럴을 던집니다
int main() {
// 입력 읽기
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: try 블록 안에서 validateUser를 호출하세요
// 그리고 catch (const char* error)로 던져진 메시지를 받으세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직과 흐름의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러