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

时间:2016-03-29 03:48:04

标签: c++ exception error-handling try-catch throw

我是异常处理的新手,这是一个关于我在关于这个主题的第一个作业中遇到的问题的问题。我故意给程序一个无效的小时和秒的条目来测试try / catch,所以两者都应该抛出异常。我有点理解为什么第一个catch块同时捕获两个抛出,但我不确定如何让它使用两个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;

3 个答案:

答案 0 :(得分:2)

catch es按类型区分,而不是按参数名称区分。

原则上你可以定义不同的异常类型,或者你可以使用例如std::system_error允许您传递整数错误ID。

但是,在实践中,异常的特定原因除了记录之外没有什么意义,因为它通常不会影响如何处理它。一个例外说,代码没有按照合同所说的那样做。 catch只能尝试再次(可能以某种不同的方式)做任何目标,或者反过来失败。

答案 1 :(得分:0)

您必须按数据类型捕获异常,而不是按变量名称捕获异常。尝试更像这样的东西:

function other_function(age,last_name, first_name){
        console.log("I have access to all of these:",age,last_name,first_name)
    }

validationForm(numberOfPassengers){
    for (let i=0; i < numberOfPassengers; i++) {
      let firstName = ReactDOM.findDOMNode(this.refs['firstName'+typeOfPassenger+i]).value;
      let lastName = ReactDOM.findDOMNode(this.refs["lastName"+typeOfPassenger+i]).value
      let age = ReactDOM.findDOMNode(this.refs['age'+typeOfPassenger+i]).value;
      let regex = /^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$/;
      let resultFirstName = firstName.match(regex);
      let resultLastName = firstName.match(regex);
      if(age <= 0){
        ('.age-alignment').addClass('error-border');
      }
      if(!resultFirstName){
        ('.first-name').addClass('error-border');
      };
      if(!resultLastName){
        ('.last-name').addClass('error-border');
      }
      return other_function(age,first_name,last_name)
    }
  }

可替换地:

#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;
}

答案 2 :(得分:0)

如果您设置自己的类型,即struct和test,您可以看到try / throw / 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;
    }


}