Menu
CoddyTech

“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 关键字让你可以控制程序何时以及如何报告错误,使函数在处理无效条件时更加健壮、可预测。

challenge icon

挑战

简单

创建一个程序,使用 throw 关键字实现输入验证,在检测到无效条件时手动触发异常。本次挑战将检验你是否理解如何在自己的函数中使用 throw 来报告错误。

程序将收到以下输入:

  • 一个字符串 username,表示用户选择的用户名(这一行可能为空)
  • 一个整数 age,表示用户的年龄

你的程序应该:

  1. 创建一个名为 validateUser 的函数,该函数接受一个字符串和一个整数作为参数
  2. 在函数内部检查用户名是否为空(长度是否为 0)
  3. 如果用户名为空,使用 throw 抛出字符串 "Username cannot be empty"
  4. 检查年龄是否小于 13
  5. 如果年龄小于 13,使用 throw 抛出字符串 "Age must be at least 13"
  6. 如果两项验证都通过,打印 "User validation successful"
  7. 在主函数中,使用输入值调用 validateUser
  8. 使用 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C++ 在线编译器