Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для Alexey104
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105

Передача исключения из одного catch-блока в другой

19.06.2016, 18:50. Показов 2895. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Начал тут изучать исключения в С++, хотел бы кое-что прояснить. Если я всё правильно понял, процесс обработки исключений в С++ выглядит следующим образом:

В качестве исключения мы можем использовать либо собственноручно созданный объект, либо любой из типов, доступных в языке(строку, число и т.д.). Потенциально опасные строки кода(т.е. те, которые могут сгенерировать исключение) помещаются внутрь try-блока. Любые объекты, созданные внутри try-блока, являются локальными объектами этого блока подобно тому, как любые объекты, созданные внутри тела функции, являются локальными объектами этой функции.Оператор throw для try-блока является чем-то вроде оператора return для функции - он возвращает(выбрасывает) объект-исключение, немедленно прерывая выполнение try-блока. При срабатывании оператора throw начинается раскрутка стека, то есть все локальные объекты try-блока удаляются в порядке, обратном их созданию. Стек раскручивается до тех пор, пока не будет найден первый(ближайший) catch-обработчик, способный поймать и обработать сгенерированное исключение. Если такой обработчик не найден, стек раскручивается до самого первого вызова, которым является функция main(), после чего программа завершается вызовом функции terminate().

Насколько мне известно, С++ позволяет использовать несколько последовательных catch-обработчиков для обработки одного исключения, то есть имеется возможность передать исключение из одного catch-блока вдругой в случае, если первый обработчик не решил проблему, связанную с исключительной ситуацией. Но у меня что-то не получается реализовать данный механизм:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
using namespace std;
 
class Exception
{
  private:
 
  public:
    Exception() {cout << "Exception object created..." << "\n";}
};
 
int main()
{
  try
      {
        cout << "First throw..." << "\n";
        throw Exception();
      }
  catch(Exception ExObj)
       {
         cout << "Second throw..." << "\n";
         throw;
       }
  catch(Exception &ExObj)
       {
         cout << "Catched." << "\n";
       }
  return 0;     
}
GCC отказывается компилировать данный код, думая, что я пытаюсь применить к объекту-исключению два catch-обработчика одновременно:
In function ‘int main()’:
25:3: warning: exception of type ‘Exception’ will be caught
catch(Exception &ExObj)
^~~~~
20:3: warning: by earlier handler for ‘Exception’
catch(Exception ExObj)
^~~~~

Код компилируется, если строку 25 изменить следующим образом:
C++
1
catch(...)
, но второй catch-блок всё равно ничего не ловит:
First throw...
Exception object created...
Second throw...
terminate called after throwing an instance of 'Exception'
Aborted (core dumped)


Как передать ExObj из catch-блока, объявленного в строке 20, в catch-блок, объявленный в строке 25?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2016, 18:50
Ответы с готовыми решениями:

Разбор блока catch (исключения)
Задание звучит так: Даны две функции: double hmean(double a, double b) throw(hmean_error) - нахождение среднего гармонического. ...

Исключения try-catch
Здравствуйте, пытаюсь с помощь try-catch сделать обработку исключений. #include &lt;iostream&gt; #include &lt;cmath&gt; #include...

Зацикленный Catch ( исключения )
Всем доброго времени суток. Столкнулся с такой проблемой: В ниже приведенном коде, почему то, при установке флага failbit, когда управление...

3
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
19.06.2016, 19:24
Цитата Сообщение от Alexey104 Посмотреть сообщение
GCC отказывается компилировать данный код
Правильно делает.

Цитата Сообщение от Alexey104 Посмотреть сообщение
Насколько мне известно, С++ позволяет использовать несколько последовательных catch-обработчиков для обработки одного исключения, то есть имеется возможность передать исключение из одного catch-блока вдругой в случае, если первый обработчик не решил проблему, связанную с исключительной ситуацией. Но у меня что-то не получается реализовать данный механизм
Ты неверно истолковал концепцию.

Цитата Сообщение от Alexey104 Посмотреть сообщение
Как передать ExObj из catch-блока, объявленного в строке 20, в catch-блок, объявленный в строке 25?
Зачем?

PS.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
using namespace std;
 
class Exception
{
  private:
 
  public:
    Exception() {cout << "Exception object created..." << "\n";}
};
 
int main()
{
    try
    {
        try
        {
            cout << "First throw..." << "\n";
            throw Exception();
        }
        catch(Exception ExObj)
        {
            cout << "Second throw..." << "\n";
            throw;
        }
    }
    catch(Exception &ExObj)
    {
        cout << "Catched." << "\n";
    }
    
    return 0;     
}
1
 Аватар для Alexey104
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105
19.06.2016, 19:33  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем?
Да я и сам не знаю, как это может быть применимо на практике. Просто в одной статье прочитал, что это возможно, но примера реализации этого в статье не было. Вот и решил попробовать.
А за ответ - спасибо!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
19.06.2016, 19:40
Цитата Сообщение от Alexey104 Посмотреть сообщение
Да я и сам не знаю, как это может быть применимо на практике.
На практике это применяется, но не так.
Исключения действительно можно "дообрабатывать" по мере раскрутки стека, но делается это в иерархически разных catch блоках, а не находящихся на одном уровне. Catch-блоки на одном уровне служат для выбора наиболее подходящего обработчика и доступных.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2016, 19:40
Помогаю со студенческими работами здесь

Передача массива одного класса в другой С++
Доброго времени суток. Столкнулся с проблемой, есть класс который заполняет массив, этот массив нужен в другом классе. Как мне передать...

Передача переменной из одного класса в другой
Здравствуйте, пишу лабораторную и что-то чувствую, что прогер из меня неважный, весь интернет перерыл, но ответа на свой вопрос так и не...

Неправильная передача данных из одного файла в другой
Здравствуйте! Возникли проблемы с записью информации в файл. Часть кода: unsigned char bady, text, tx_bt; FILE *fp_in,...

Передача динамического массива из одного метода в другой
Здравствуйте! Ребята подскажите по такому вопросу. Пытаюсь передать динамический двумерный массив из одного метода класса в другой метод...

Обработка исключения на русские буквы (try/catch)
Доброго времени суток. Хотелось бы узнать как обработать исключение на русские буквы через try/catch (желательно кодом) Заранее спасибо


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru