我是异常处理的新手,这是一个关于我在关于这个主题的第一个作业中遇到的问题的问题。我故意给程序一个无效的小时和秒的条目来测试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;
答案 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;
}
}