Завершить вызов без активного исключения (добавить выражение catch all) - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть такой блок кода:

namespace bi = boost::intrusive;

struct Container {
    struct Item {
        bi::set_member_hook<> link;
        int x;
    };

    struct Cmp {
        bool opeartor()(Item const& it1, Item const &it2) const {
            return it1.x < it2.x;
        }
    };
    using Set = typename bi::set<Item,
                            bi::member_hook<Item, bi::set_member_hook<>, &Item::link>,
                            bi::compare<Cmp>,
                            bi::constant_time_size<false>
                            >;



    Container(Container const& o) {
        auto cloner = [](const Item &x) {
            return current_allocator().construct<Item>(x);
        };

        with_allocator(_alloctor, [&] {
            new (&_data) Set;

            _data.clone_from(o._data, cloner, current_deleter<Item>());
        }
    }


private:
    Set _data;
};

Программа иногда завершается с этим сообщением:

завершить вызов без активного исключения

Я нашел ответ от stackoverflow, который из-за throw был вызван без активного исключения. Но если без активного исключения он не сможет достичь блока catch.

Извините за мой плохой английский

РЕДАКТИРОВАТЬ: пример кода был обновлен.

РЕДАКТИРОВАТЬ 2: Исправьте код, как @: рекомендуется RemyLebeau, и ошибка все еще происходит.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я думаю, что сообщение

завершается вызовом без активного исключения

фактически означает, что

завершается вызовом без активного C ++исключение

terminate() может вызываться по многим различным причинам, не ограничиваясь необработанными исключениями C ++.Предложение catch (...) перехватывает только исключения C ++.В вашем конкретном случае terminate() может вызываться в allocate_memory() или clone() напрямую или во время выполнения из-за необработанных исключений, не относящихся к C ++ (например, некоторые низкоуровневые исключения Windows, которые должны быть записаны с SEH ).В любом случае блок захвата никогда не вводится.

0 голосов
/ 20 ноября 2018

Вы вызвали бросок из улова, но улов должен был его поймать.Вместо этого бросок должен был быть в попытке, если я правильно понял.

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