为什么我的程序不执行第二个catch块
Why wont my program execute the second catch block?
我是异常处理的新手,这是一个关于我在第一次作业中遇到的问题的问题。为了测试try/catch,我故意给程序一个无效的条目,持续了好几个小时和几秒钟,所以两者都应该抛出一个异常。我有点明白为什么第一个接球盖帽同时接住两次投球,但我不确定如何使用两个接球盖帽?谢谢(输出为"ERROR:INVALID HOUR ENTRY")
int main()
{
MilTime Object;
string BadHour;
string BadSeconds;
try
{
if ( (Object.getHour() < 0) || (Object.getHour() > 2359) ) throw BadHour;
if ( (Object.getSec() < 0) || (Object.getSec() > 59 ) ) throw BadSeconds;
}
catch (string BadHour)
{
cout << "ERROR, INVALID HOUR ENTRY";
}
catch (string BadSeconds)
{
cout << "ERROR, INVALID SECOND ENTRY";
}
return 0;
catch
es是按类型区分的,而不是按参数名称区分的。
原则上,您可以定义不同的异常类型,也可以使用例如std::system_error
,它允许您传递整数错误id。
然而,在实践中,除了日志记录之外,对异常的特定原因没有什么兴趣,因为它通常不会影响如何处理它。异常表示代码未能完成合同规定的它应该做的事情。catch
只能尝试执行该目标,再次(可能以某种不同的方式),或者反过来失败。
您必须通过数据类型而不是变量名来捕获异常。试试类似的东西:
#include <iostream>
#include <stdexcept>
class BadHourError : public std::runtime_error
{
public:
BadHourError() : std::runtime_error("") {}
};
class BadSecondsError : public std::runtime_error
{
public:
BadSecondsError() : std::runtime_error("") {}
};
class MilTime
{
public:
int getHour() const { return ...; }
int getSec() const { return ...; }
};
int main()
{
MilTime Object;
try
{
if ( (Object.getHour() < 0) || (Object.getHour() > 2359) ) throw BadHourError();
if ( (Object.getSec() < 0) || (Object.getSec() > 59 ) ) throw BadSecondsError();
}
catch (const BadHourError &)
{
std::cout << "ERROR, INVALID HOUR ENTRY";
}
catch (const BadSecondsError &)
{
std::cout << "ERROR, INVALID SECOND ENTRY";
}
return 0;
}
或者:
#include <iostream>
#include <string>
#include <stdexcept>
class BadTimeError : public std::runtime_error
{
public:
BadTimeError(const std::string &what_arg) : std::runtime_error(what_arg) {}
};
class BadHourError : public BadTimeError
{
public:
BadHourError() : BadTimeError("INVALID HOUR ENTRY") {}
};
class BadSecondsError : public BadTimeError
{
public:
BadSecondsError() : BadTimeError("INVALID SECOND ENTRY") {}
};
class MilTime
{
public:
int getHour() const { return ...; }
int getSec() const { return ...; }
};
int main()
{
MilTime Object;
try
{
if ( (Object.getHour() < 0) || (Object.getHour() > 2359) ) throw BadHourError();
if ( (Object.getSec() < 0) || (Object.getSec() > 59 ) ) throw BadSecondsError();
}
catch (const BadTimeError &ex)
{
std::cout << "ERROR, " << ex.what();
}
return 0;
}
如果您设置自己的类型,即struct's和test,您可以看到try/shop/catch实际上是依赖于类型的:
#include <iostream>
using namespace std;
struct BadHr
{
};
struct BadSec
{
};
int main()
{
int test = 2;
try
{
if (test == 1) throw BadHr();
if (test == 2) throw BadSec();
}
catch (BadHr& e)
{
std::cout << "Bad hour" << std::endl;
}
catch (BadSec& e)
{
std::cout << "Bad Sec" << std::endl;
}
}
相关文章:
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 将第二个 GATT 服务添加到 Movesense 容器
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 使第二个类的构造函数成为第一个类中的友元函数
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
- 打印无序映射的第二个元素,即集合
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 需要使用模板查找数组的第二个最小和最小值
- c++:交换向量中所有元组的第一个和第二个元素
- 如果条件,当我想第二个参数时
- 为什么我的程序不执行第二个catch块
- 当错误存在时,为什么我的程序不执行第二个catch块