20.异常捕获

20.异常捕获


20.1 知识点

异常捕获的作用

异常捕获的主要作用是避免当代码发生错误时,程序卡死或无法继续执行的问题。通过捕获异常,程序可以在出现错误时正常处理,并提示用户,而不是直接崩溃。

示例代码:
将玩家输入的内容存储到 string 类型的变量中:

string str;
cin >> str; // 如果输入 "韬"
int i = stoi(str); // 程序崩溃,因为无法将非数值字符串转为整数
cout << i << endl;

在上述例子中,如果输入非数值字符串,stoi 会抛出异常,导致程序崩溃。这就是异常捕获需要解决的问题。

异常捕获的基本语法

异常捕获的基本结构如下:

try
{
    // 希望进行异常捕获的代码块
    // 如果这里的代码抛出异常,不会导致程序卡死
}
catch (const std::exception&)
{
    // 如果发生异常,执行此处代码
    // 通过传入的 `std::exception` 对象可以获取报错的详细信息
}

注意:

  • 异常捕获代码的基本结构中,不需要加分号 (;)。
  • trycatch 块内部的每一行代码需要加分号。

异常捕获的实践

以下是异常捕获的实践案例:

try
{
    string str;
    cin >> str; // 如果输入 "韬",提示 "你输入的内容不是数值,请规范输入"
    
    // 可能存在问题的代码
    int i = stoi(str);
    cout << i << endl;
}
catch (const std::exception&)
{
    // 如果报错,执行以下内容
    cout << "你输入的内容不是数值,请规范输入" << endl;
}

在该示例中,如果用户输入非法内容(如非数值字符串),程序不会崩溃,而是会捕获异常并提示用户重新输入正确的内容。


20.2 知识点代码

Lesson20_异常捕获.cpp

#include <iostream>
#include <string>
using namespace std;
int main()
{
    std::cout << "异常捕获\n";

    #pragma region 知识点一 异常捕获的作用

    //为什么要学习异常捕获?
    // 它可以避免当代码报错时 造成程序卡死、无法继续往下执行 的问题
    
    //将玩家输入的内容 存储 string类型的变量(容器)中
    string str;
    cin >> str;//如果输入韬
    //将字符串转为 数值类型时 必须 要合法合规 否则程序崩溃
    int i = stoi(str);//程序崩溃
    cout << i << endl;

    #pragma endregion

    #pragma region 知识点二 异常捕获的基本语法

    try
    {
        //希望进行异常捕获的代码块
        //放到try中 
        //如果try中的代码 报错了 不会让程序卡死
    }
    catch (const exception&)
    {
        //如果出错了 会执行 catch中的代码 来捕获异常
        //catch(const std::exception&) 具体报错跟踪 可以利用传入的对象获取到相关报错内容
    }
    //注意:异常捕获代码基本结构中 不需要加; 在里面去写代码逻辑时  每一句代码才加;

    #pragma endregion

    #pragma region 知识点三 异常捕获的实践

    try
    {
        string str;
        cin >> str;//如果输入韬 打印你输入的内容不是数值,请规范输入
        //可能存在问题的代码
        int i = stoi(str);
        cout << i << endl;
    }
    catch (const std::exception&)
    {
        //如果报错 才会执行的内容
        cout << "你输入的内容不是数值,请规范输入" << endl;
    }

    #pragma endregion
}

20.3 练习题

输入数字并处理异常

请用户输入一个数字,如果输入有误,则提示用户输入错误:

try
{
    string str;
    cin >> str;
    int i = stoi(str);
    cout << "你输入的数字是" << i << endl;
}
catch (const std::exception&)
{
    cout << "用户输入错误" << endl;
}

输入姓名和成绩并处理异常

提示用户输入姓名、语文、数学、英语成绩。如果输入的成绩有误,则提示用户输入错误,否则将输入的字符串转为整形变量存储:

try
{
    string str2;
    cout << "请输入你的姓名" << endl;
    cin >> str2;

    cout << "请输入你的语文成绩" << endl;
    cin >> str2;
    // 将字符串转为语文成绩,用数值变量存储
    int yuwen = stoi(str2);

    cout << "请输入你的数学成绩" << endl;
    cin >> str2;
    int shuxue = stoi(str2);

    cout << "请输入你的英语成绩" << endl;
    cin >> str2;
    int yingyu = stoi(str2);
}
catch (const std::exception&)
{
    cout << "用户输入错误" << endl;
}

20.4 练习题代码

Lesson20_练习题.cpp

#include <iostream>
#include <string>
using namespace std;
int main()
{
    std::cout << "异常捕获练习题\n";

    #pragma region 练习题一

    //请用户输入一个数字
    //如果输入有误,则提示用户输入错误

    try
    {
        string str;
        cin >> str;
        int i = stoi(str);
        cout << "你输入的数字是" << i << endl;
    }
    catch (const std::exception&)
    {
        cout << "用户输入错误" << endl;
    }

    #pragma endregion

    #pragma region 练习题二

    //提示用户输入姓名、语文、数学、英语成绩
    //如果输入的成绩有误,则提示用户输入错误
    //否则将输入的字符串转为整形变量存储

    try
    {
        string str2;
        cout << "请输入你的姓名" << endl;
        cin >> str2;
        cout << "请输入你的语文成绩" << endl;
        cin >> str2;
        //将字符串转为语文成绩 用数值变量存储
        int yuwen = stoi(str2);

        cout << "请输入你的数学成绩" << endl;
        cin >> str2;
        int shuxue = stoi(str2);

        cout << "请输入你的英语成绩" << endl;
        cin >> str2;
        int yingyu = stoi(str2);
    }
    catch (const std::exception&)
    {
        cout << "用户输入错误" << endl;
    }

    #pragma endregion

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏