C ++ перехватывает исключение в цикле и возвращает _after_ цикл завершается? - PullRequest
0 голосов
/ 09 декабря 2018

Цель состоит в том, чтобы полностью обработать цикл и выдать любое исключение, которое могло произойти впоследствии:

for (...) {
   try {
      // code that could throw
   } catch (const ExceptionObj &ex) {
      // save ex and rethrow after the loop
   }
}

Что было бы лучшим способом для этого?Сохранение любых исключений - это нормально в моем конкретном случае.

У меня есть пара идей:

  1. Копирование ex вExceptionObj значение.Проблема: не масштабируется вообще, когда ex имеет подклассы или нужно обрабатывать больше исключений.

  2. Есть метод clone в ExceptionObj, который возвращает копию в куче,Проблема: не работает для сторонних исключений.

1 Ответ

0 голосов
/ 09 декабря 2018

Обработка брошенного объекта исключения таким стертым способом - это то, для чего существует std::exception_ptr:

std::exception_ptr ex;
for (...) {
   try {
      // code that could throw
   } catch (...) {
      ex = std::current_exception();
   }
}
if(ex) // Only evaluates to true if a thrown exception was assigned to it.
    std::rethrow_exception(ex);

Все проблемы времени жизни, связанные с динамическим типом исключенияОбъект обрабатывается стандартной библиотекой.Вы можете думать о ex как дескриптор подсчитанной ссылки к объекту исключения, позволяющий вывести его из блока try-catch.

Это соответствует подходу, который вы изложили в своем посте, а затем подтвердили вкомментарий, что последнее выброшенное исключение - это то, которое выдается повторно.

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