20.异常捕获
20.1 知识点
异常捕获的作用
异常捕获的主要作用是避免当代码发生错误时,程序卡死或无法继续执行的问题。通过捕获异常,程序可以在出现错误时正常处理,并提示用户,而不是直接崩溃。
示例代码:
将玩家输入的内容存储到 string
类型的变量中:
string str;
cin >> str; // 如果输入 "韬"
int i = stoi(str); // 程序崩溃,因为无法将非数值字符串转为整数
cout << i << endl;
在上述例子中,如果输入非数值字符串,stoi
会抛出异常,导致程序崩溃。这就是异常捕获需要解决的问题。
异常捕获的基本语法
异常捕获的基本结构如下:
try
{
// 希望进行异常捕获的代码块
// 如果这里的代码抛出异常,不会导致程序卡死
}
catch (const std::exception&)
{
// 如果发生异常,执行此处代码
// 通过传入的 `std::exception` 对象可以获取报错的详细信息
}
注意:
- 异常捕获代码的基本结构中,不需要加分号 (
;
)。 - 在
try
和catch
块内部的每一行代码需要加分号。
异常捕获的实践
以下是异常捕获的实践案例:
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