为什么我的程序不执行第二个catch块

Why wont my program execute the second catch block?

本文关键字:第二个 catch 执行 我的 程序 为什么      更新时间:2023-10-16

我是异常处理的新手,这是一个关于我在第一次作业中遇到的问题的问题。为了测试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;
    }

}
相关文章: