“throw”关键字
本课属于 Coddy C++ 学习旅程的“逻辑与流程”单元。第 50 课,共 56 课。
有时,你需要在自己的代码中发出错误信号,而不只是捕获其他函数抛出的异常。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)
- 如果用户名为空,使用
throw抛出字符串"Username cannot be empty" - 检查年龄是否小于 13
- 如果年龄小于 13,使用
throw抛出字符串"Age must be at least 13" - 如果两项验证都通过,打印
"User validation successful" - 在主函数中,使用输入值调用
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++ 在线编译器