Catch块不想捕获抛出的异常

时间:2012-01-08 17:19:50

标签: c++ qt exception exception-handling

我有一个代码:

void Engine::count(const std::set<boost::filesystem3::path>& files)
{
    for (auto e : files)
    {
        try
        {
            count_(e);
        }
        catch (const Bad_formatting& ) // Here I'm trying to catch this exception
        {//but debugger never stops on this line even though breakpoint is set
            throw;                     // and re-throw it
        }
    }
} 

然后有count_函数:

void Engine::count_(const boost::filesystem3::path& file)
{
    // and somewhere along this lines I'm throwing Bad_Formatting: 

    if (something)
    {

    }
    else
    {
        throw Bad_formatting(file,"No end of multicomment found.");
    }
}

但是在抛出这个异常后,我正在通过对话告诉我,我的应用程序要求运行时以不寻常的方式终止...
例外永远不会发生。为什么?这两个fncs都是静态的这个事实与它有什么关系吗?或者我正在使用Qt的事实? 编辑:
这是调用count的代码:

try
    {

            Engine::count(files);



    }
    catch (const Bad_formatting& e)
    {

        QMessageBox::warning(nullptr,"Bad Formatting",msg);
    }  
//// 



struct Bad_formatting : public std::runtime_error
{
private:
    boost::filesystem3::path file_name_;

public:
    Bad_formatting(boost::filesystem3::path file_name,
                   const char* msg):std::runtime_error(msg),
                                    file_name_(file_name)
    {

    }

    const boost::filesystem3::path& file_name()const
    {
        return file_name_;
    }
    ~Bad_formatting()throw()
    {/*eb*/}
};

2 个答案:

答案 0 :(得分:2)

从您展示的代码中

  1. 抛出异常;
  2. 抓住它;
  3. 重新抛出;
  4. 再也不会抓住它。
  5. 第4项似乎是重要的部分。

答案 1 :(得分:0)

您使用的是什么编译器/工具链/调试器?如果您正在使用GCC,则可以使用catch throwcatch catch命令在异常抛出/捕获时添加断点。

由于可能的原因是它没有被捕获,如果catch块中的唯一代码是throw,编译器可能已经优化了整个块。考虑将任何指令添加到块中(注意任何可能需要一些带有实际副作用的指令,否则编译器也可能会对其进行优化)