|
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
|
|
| 07.04.2016, 18:54 | |
|
Ответы с готовыми решениями:
9
try-throw-catch try, catch, throw
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 07.04.2016, 19:12 | ||||||
|
вы пишите код, который на входе получает некие аргументы. он проверяет их. и если они не корректны, то он должен предупредить об этом вызывающую сторону. последний станет не нужен. но киллер-фича не в этом. суть в том, что механизм исключений сильно понижает влияние человеческого фактора. на эксепшенах можно построить отказоустойчивый софт. который сможет работать в условиях программных сбоев, и справится даже с теми ошибками, про которые программисты изначально даже и не знали. достигается это за счет возможности реализовать автоматические и эвристические алгоритмы восстановления после паники. вы пишите софт самолета. произошел отказ оборудования. vcl поймал эксепшен, что дальше? как это вам поможет восстановить штатную работу софта? на борту самолета 150 пассажиров. все что вам нужно - вовремя среагировать, и запустить аварийный модуль.
1
|
||||||
|
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 | ||
|
2) Некоторые вещи можно проверять силами STL. Например, векторный at() сам проверяет выход за границы массива. А так да, в конечном счете кто-то, где-то, должен делать явные проверки. 3) Затем, чтобы не лепить портянку из if(errno) return, if(errno) return. Плюс, стандартное std::exception летит вместе с диагностическим сообщением (доступно через метод what()).
1
|
||
|
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
|
|||||||
| 07.04.2016, 19:42 [ТС] | |||||||
|
Каким образом из-за ExcepHand код будет более отказоустойчивым и справится с ошибками, о которых программисты не знали, если всё равно РУКАМИ кидать throw? Тогда это как классы, просто обёртка для больших объёмов кода и тд или что-то ещё есть?! Я в упор не понимаю. Так и как тогда это делает vcl? В примере, оно перехватывает ошибку, без всяких throw, if, функций, внутри которых они могли скрываться, и тд. Кликните здесь для просмотра всего текста
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 07.04.2016, 20:04 | |||
|
1
|
|||
|
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
|
|||||||
| 08.04.2016, 00:33 [ТС] | |||||||
|
Всем большое спасибо, многое прояснилось! Ещё чуть-чуть...
Покажите, пожалуйста, пример с std::exception и заодно как по вашему нужно ловить переполнение при умножении, например в факториале: Кликните здесь для просмотра всего текста
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 08.04.2016, 00:51 | |||||||
1
|
|||||||
|
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
|
|
| 08.04.2016, 01:15 [ТС] | |
|
Спасибо, кажется, я понял всё.
Для галочки хочется на примере факториала, сделать нормальную проверку переполнения для умножения, без магических цифр, пусть даже с просадкой. А чёртов vcl это может =D, но как сделать без него, есть идеи? Флаг в асме? Там вроде не всегда это будет работать, не со всеми типами что ли, не помню.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 08.04.2016, 19:26 | |||||||
вы не знаете, что это за исключение. вы не знаете, почему оно вылетело. но вы знаете, что оно вылетело при попытке включить двигатель. вы знаете, что что-то пошло не так, и двигатель не работает. вы можете оценить степень угрозы для жизни и использовать любые стратегии восстановления после паники. например: на тестах проблем с двигателем никогда не было. значит это - редковозникающая ошибка. значит, если мы попробуем завести его еще раз, может быть это сработает?
1
|
|||||||
| 08.04.2016, 19:26 | |
|
Помогаю со студенческими работами здесь
10
Try Throw Catch пример try, throw, catch...обработка исключений C++ try catch throw в разных функциях Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ритм жизни
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
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|