Блок Catch не хочет перехватывать выброшенное исключение - PullRequest
0 голосов
/ 08 января 2012

У меня есть код:

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?
EDIT:
Это код, который подсчитывает количество звонков:

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 ]

2 голосов
/ 08 января 2012

Из кода, который вы показываете

  1. выбросить исключение;
  2. поймай это;
  3. отбросить его;
  4. никогда не поймай его снова.

Пункт 4 представляется важной частью.

0 голосов
/ 08 января 2012

Какой компилятор / набор инструментов / отладчик вы используете?Если вы используете GCC, вы можете использовать команды catch throw и catch catch для добавления точек останова при выбрасывании / перехвате исключений.

По возможным причинам, по которым он не перехватывается, если единственный код вБлок catch - это бросок, компилятор мог оптимизировать весь блок.Попробуйте добавить в блок любую инструкцию (примечание любая может потребовать какую-то инструкцию с реальными побочными эффектами, или компилятор также может ее оптимизировать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...