如果我有这样的话:
if(condition1)
{
cout<<"ERROR: Expected an identifier \n.";
throw std::invalid_argument("");
}
if(condition2)
{
moveToken();
cout<<"ERROR: Expected a ' ( ' after Identifier \n.";
throw std::invalid_argument("");
}
moveToken();
try
{
try
{
newPosition = position;
fcNode->addChild(actual_params());
}
catch(exception &e)
{
position=newPosition;
if(condition3)
{
moveToken();
cout<<"ERROR: Expected a ' ) ' \n.";
throw std::invalid_argument("");
}
moveToken();
return fcNode;
}
if(condition4)
{
moveToken();
cout<<"ERROR: Expected a ' ) ' \n.";
throw std::invalid_argument("");
}
}
catch (exception &e)
{
moveToken();
throw std::invalid_argument("");
}
condition1
块引发的异常会被任何catch
块捕获,还是需要将整个代码放在另一个try
块中并执行catch
为了它? (throw
被第一次遇到的catch
阻止了吗?)谢谢
答案 0 :(得分:2)
如果您有以下代码:
try{
// block 1
}catch(exception){
// block 2
}
来自exception
的每block 1
个block 2
将被catch
捕获并处理; block 1
块无法捕获{{1}}之外的任何异常,所以是的,你必须再做一次try-catch
答案 1 :(得分:2)
execption将被一个类型匹配catch
块捕获,该块附加到包含throw的任何try
块。如果没有try
块在当前作用域中包含throw,或者没有任何附加的catch块匹配异常的类型,那么异常将在调用链中向上发送(即发送到称为此函数的任何函数)。重复直到我们到达main,如果没有捕获异常,程序将被终止。
在您突出显示的代码中,该抛出周围没有封闭的try
块,因此异常将在调用链中进一步处理,如果有的话。
答案 2 :(得分:1)
是的,你必须将你的漏洞代码放入一个catch区块,因为异常只是为了解决问题。
try {
//(.inside here can be catched.)
} catch(const std::exception& ex){
// here goes you catched exception
}
答案 3 :(得分:0)
在C ++中,与JAVA不同,任何类型都可用于捕获异常 例如:
try {
int integer_ = 11;
throw integer_;
} catch(int e) {
std::cout<<e<<"\n";//Displays 11
}
您可以使用多个捕获块,如:
try {
int integer_ = 11;
std::string string_ = "thrown exception";
throw string_;
} catch(const std::string& e) {
std::cout<<e<<"\n";//Displays thrown exception
} catch(int e) {//This block is not treated, beacause no integer is thrown as an exception
std::cout<<e<<"\n";
}