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

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

19.06.2016, 18:50. Показов 2854. Ответов 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru