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

Try,catch,throw,OVERFLOW!

07.04.2016, 18:54. Показов 3007. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
И СНОВА с вами try..catch...
Я очень долго пытался понять try-catch сам, читал везде, где только можно(ссылки давать уже мб бесполезно), вот к чему я пришёл(пожалуйста, максимально развёрнуто прокомментируйте утверждения, заранее большое спасибо):

1) Я не могу просто полагаться на try-catch, если у меня произошла ошибка, программа всё равно накроется?
2) Нужно самому всё проверять (например IF-ами), как будто я делаю всё в обычном СИ, потом в случае ошибки кидать throw?
3) Тогда зачем мне вообще try-catch, если я должен руками всё проверять и сам кидать throw?
4) Только потому что "более удобная/компактная запись", или, я что-то упустил?

5) Скажем, с <vcl.h> мне не нужно думать ни о чём, все ошибки он ловит без всякого throw "сам" через catch(...).
Как это происходит? Как этого достичь самому, не пользуясь никаким vcl?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2016, 18:54
Ответы с готовыми решениями:

try-throw-catch
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class Drob { public: int obchuslennia (int a, int...

try, catch, throw
пишу класс namespace mystd { const uint32_t def_size = 1 &lt;&lt; 20; //default memory container template&lt;typename T&gt; ...

Try..catch..Throw
Объясните пожалуйста разницу. Желательно с примерами, например деление на ноль, ну или чтобы было сразу несколько исключений. Расскажите...

9
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.04.2016, 19:12
Цитата Сообщение от niceonehere Посмотреть сообщение
Я не могу просто полагаться на try-catch, если у меня произошла ошибка, программа всё равно накроется?
серебряной пули не существует.

Цитата Сообщение от niceonehere Посмотреть сообщение
Нужно самому всё проверять (например IF-ами), как будто я делаю всё в обычном СИ, потом в случае ошибки кидать throw?
да.
вы пишите код, который на входе получает некие аргументы.
он проверяет их. и если они не корректны,
то он должен предупредить об этом вызывающую сторону.

Цитата Сообщение от niceonehere Посмотреть сообщение
Тогда зачем мне вообще try-catch, если я должен руками всё проверять и сам кидать throw?
когда машина научится самостоятельно делать работу программиста,
последний станет не нужен.

Цитата Сообщение от niceonehere Посмотреть сообщение
Только потому что "более удобная/компактная запись", или, я что-то упустил?
в некоторых случаях очень удобно/компактно.

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

достигается это за счет возможности реализовать
автоматические и эвристические алгоритмы
восстановления после паники.

Цитата Сообщение от niceonehere Посмотреть сообщение
Скажем, с <vcl.h> мне не нужно думать ни о чём, все ошибки он ловит без всякого throw "сам" через catch(...).
ваша позиция ущербна.

вы пишите софт самолета.

произошел отказ оборудования.

vcl поймал эксепшен, что дальше?
как это вам поможет восстановить штатную работу софта?

на борту самолета 150 пассажиров.
все что вам нужно - вовремя среагировать,
и запустить аварийный модуль.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
07.04.2016, 19:14
niceonehere,
try catch нужен тогда, когда код не может сам исправить ошибку, т.к. не знает как на нее реагировать. Например, вы при запуске программы читаете файл параметров. Причем делаете это в несколько уровней: main вызывает ReadParams() которая вызывает ReadStringFromFile("1.txt"). О том, что файла не существует можно узнать только в самом низу, причем, дальнейшие действия по чтению параметров не имеют смысла. Что сделать в этом случае? Альтернатива - возвращать коды ошибок - но это очень неудобно. Поэтому Если файла нет кидаете exception а в main его ловите. При этом в Функции ReadParams() никакой обработки отсутствия файла не требуется - т.е. это сильно упрощает код.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
07.04.2016, 19:14
Цитата Сообщение от niceonehere Посмотреть сообщение
1) Я не могу просто полагаться на try-catch, если у меня произошла ошибка, программа всё равно накроется?
1) Не накроется, если не говнокодить. Все стандартные исключения наследуются от std::exception, поэтому поставив catch на std::exception вы переловите все стандартные исключения. И все нестандартные, если их тоже наследовать от std::exception. Остаются еще асинхронные (типа деления на ноль), но их в нормальной программе быть не должно. И их тоже можно ловить, но уже с бубном.
2) Некоторые вещи можно проверять силами STL. Например, векторный at() сам проверяет выход за границы массива. А так да, в конечном счете кто-то, где-то, должен делать явные проверки.
3) Затем, чтобы не лепить портянку из if(errno) return, if(errno) return. Плюс, стандартное std::exception летит вместе с диагностическим сообщением (доступно через метод what()).
1
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
07.04.2016, 19:42  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
суть в том, что механизм исключений сильно понижает влияние человеческого фактора.
на эксепшенах можно построить отказоустойчивый софт.
который сможет работать в условиях программных сбоев,
и справится даже с теми ошибками,
про которые программисты изначально даже и не знали.
Ваши комментарии (за исключением пули) кажутся наиболее близкими к моему вопросу, но можете объяснить подробней?
Каким образом из-за ExcepHand код будет более отказоустойчивым и справится с ошибками, о которых программисты не знали, если всё равно РУКАМИ кидать throw? Тогда это как классы, просто обёртка для больших объёмов кода и тд или что-то ещё есть?! Я в упор не понимаю.
Так и как тогда это делает vcl? В примере, оно перехватывает ошибку, без всяких throw, if, функций, внутри которых они могли скрываться, и тд.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int _tmain () {
  try
  {
    int a=1,b=0;
    a=a/b;
    std::cout << a<< std::endl;
  }
  catch (...)
  {
    std::cout << "exception caught" << '\n';
  }
  std::cin.ignore();
  std::cin.get();
  return 0;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
07.04.2016, 20:04
Цитата Сообщение от niceonehere Посмотреть сообщение
Каким образом из-за ExcepHand код будет более отказоустойчивым и справится с ошибками, о которых программисты не знали, если всё равно РУКАМИ кидать throw?
Он справится со сбоями известными автору библиотеки, но неизвестными программисту который эту библиотеку использует. Ну, чем-то вроде "извиняйте, но плагина для чтения таких файлов нема и вообще, памяти маловато". Тем не менее, чтобы все это работало, кто-то все равно должен ручками вписать throw. Если не программист, то автор используемой им библиотеки.
Цитата Сообщение от niceonehere Посмотреть сообщение
Так и как тогда это делает vcl? В примере, оно перехватывает ошибку, без всяких throw, if, функций, внутри которых они могли скрываться, и тд.
Видимо, main неявно вызывается из функции, которая и содержит нужные обертки. По умолчанию C++ компиляторы цепляют к коду целый шмат стандартных библиотек. Если этот шмат отломать, программа похудеет этак до килобайта, но автоперехват ошибок отвалится.
1
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
08.04.2016, 00:33  [ТС]
Всем большое спасибо, многое прояснилось! Ещё чуть-чуть...

Покажите, пожалуйста, пример с std::exception и заодно как по вашему нужно ловить переполнение при умножении, например в факториале:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
long double Fact(double a)
{
    long double b=1;
    if (a==0)
        return 1;
    else
        for(int i=1;i<=a;i++)
            b=b*i;
    return b;
}


Цитата Сообщение от hoggy Посмотреть сообщение
достигается это за счет возможности реализовать
автоматические и эвристические алгоритмы
восстановления после паники
Можно маленький простенький как 2 пальца пример, чтобы было понятно о чём речь?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.04.2016, 00:51
Цитата Сообщение от niceonehere Посмотреть сообщение
Покажите, пожалуйста, пример с std::exception и заодно как по вашему нужно ловить переполнение при умножении, например в факториале:
По техническим причинам, переполнение в арифметических операциях ловится только с бубном. Когда происходит деление на ноль, срабатывает прерывание процессора (вызывается специальная процедурка). Когда происходит переполнение, просто поднимается флажок переполнения и программа едет дальше. Постоянно проверять этот флажок - производительность просядет. Программе же постоянно нужно что-то складывать/вычитать/etc. А переключателя "проверяй/не проверяй" разработчики языка не предусмотрели. Конкретно по факториалу:
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
#include<iostream>
#include<stdexcept>
 
using namespace std;
 
double factorial(int x)
{
    if(x<0)
        throw std::out_of_range("Факториалов отрицательных чисел не бывает");
    if(x>170)
        throw std::out_of_range("Факториал больше 170-го в double не влезет");
 
    double res=1;
    for(int i=2;i<=x;++i)
        res*=i;
    return res;
}
 
int main()
{
    try
    {
        int x;
        cin>>x;
        cout<<factorial(x)<<endl;
    }
    catch(const std::exception& error)
    {
        cout<<error.what()<<endl;
    }
    return 0;
}
1
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
08.04.2016, 01:15  [ТС]
Спасибо, кажется, я понял всё.
Для галочки хочется на примере факториала, сделать нормальную проверку переполнения для умножения, без магических цифр, пусть даже с просадкой.
А чёртов vcl это может =D, но как сделать без него, есть идеи?
Флаг в асме? Там вроде не всегда это будет работать, не со всеми типами что ли, не помню.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.04.2016, 19:26
Цитата Сообщение от niceonehere Посмотреть сообщение
Можно маленький простенький как 2 пальца пример, чтобы было понятно о чём речь?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try{
    запуститьДвигатель();
}
catch(const ОтказДвигателя& e)
{
    запуститьАварийныйДвигатель();
}
catch(const std::exception& e)
{
    Рапорт("при попытке запустить двигатель, случилась вот эта херня: ", e.what()  );
    запуститьАварийныйДвигатель();
}
catch(...)
{
    Рапорт("при попытке запустить двигатель, приключился шандец-мандец полный");
    запуститьАварийныйДвигатель();
}
в секцию с тремя точками попадет любое вылетевшее исключение.
вы не знаете, что это за исключение.
вы не знаете, почему оно вылетело.

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

например: на тестах проблем с двигателем никогда не было.
значит это - редковозникающая ошибка.
значит, если мы попробуем завести его еще раз,
может быть это сработает?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2016, 19:26
Помогаю со студенческими работами здесь

throw, try, catch
Пожалуйста, помогите разобраться в том, что это такое, и как его правильно использовать. Где можно об этом почитать? P.S. только начал...

Try, catch, throw
Подскажите, как с помощью try, catch, throw, обработать исключение на вводимый тип данных? Например, допускается только тип int, что...

Try Throw Catch пример
Как-то не особо много инфы нарыл по данной теме... Может у кого есть какие уже реализованные примеры?

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

C++ try catch throw в разных функциях
try и catch находятся в одной функции а throw вызывается из другой. ну MVS выкидывает исключение вместо передачи управления. что делать?...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru