在尝试之前投掷......抓住

时间:2014-05-20 21:08:01

标签: c++ exception exception-handling

如果我有这样的话:

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阻止了吗?)谢谢

4 个答案:

答案 0 :(得分:2)

如果您有以下代码:

try{
    // block 1
}catch(exception){
    // block 2
}

来自exception的每block 1block 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";
}