|
0 / 0 / 0
Регистрация: 09.10.2020
Сообщений: 26
|
||||||
Не работает перехват исключений try catch в GCC15.10.2020, 17:11. Показов 5836. Ответов 29
Из блока try catch вызывается процедура proc в которой возникают разного вида исключения, но ни одно из них не перехватывается этим блоком.
Что я делаю не так?
0
|
||||||
| 15.10.2020, 17:11 | |
|
Ответы с готовыми решениями:
29
не работает перехват исключений Не работает обработка исключений Try Catch для Convert.ToInt32("123.4a")
|
|
0 / 0 / 0
Регистрация: 09.10.2020
Сообщений: 26
|
|
| 16.10.2020, 13:54 [ТС] | |
|
"Зачем писать код, который в обычной ситуации должен вываливаться? Обработка исключений - очень затратная и медленная операция, намного более медленная чем простые условные переходы при обнаружении недопустимых данных."
Ну,...так работает логика программы. Она верная и иначе нельзя. В том то и дело, что программа не должна "вываливаться", а должна быть информация об ошибке вычислений без аварийного завершения. Это нормальная, контролируемая работа программы , так и должно быть. А вот перехват ошибок медленный только в C/C++ по тем примерам , которые приводят. В Дельфи он работает через прерывания и абсолютно не замедляет работу программы. PS Не ужели за всё время никто в C/C++ не написал класс перехвата исключений через прерывания, который работает также, как в Дельфи? Чтобы просто подключить его include<> , а всё остальное, как в Дельфи. Мне нужно только для Windows. Добавлено через 5 минут "Просто проверяй на ноль перед делением, на nullptr перед обращением к указателю и т.д. И делай throw, если ошибка. Поверь, так будет намного лучше. Программа будет читабельнее и надёжнее." Проверка proc() на вычислительные ошибки, а также на AccessViolation принципиальна не возможна. Формула в этой процедуре задаётся извне пользователем и содержание её неизвестно. Также невозможно после каждого одиночного вычисления проверять результат на исключение. Такой вариант предлагался выше. Это очень сильно замедляет работу программы. Нужна реализация только перехвата исключений только через прерывания.
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 16.10.2020, 13:57 | |||
|
2) Включите в настройках трансляцию SEH в C++ execptions 3) Профит. PS. Про GCC в таком случае можно забыть. Он это не поддерживает.
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||
| 16.10.2020, 14:03 | |||
|
Именно так сейчас поступают все современные браузеры, (например чтобы не уронить всю программу, если в одной вкладке "заглючил" какой-то сторонний плагин). А ваш подход маскирует проблему и все равно не защитит, особенно если пользователь будет достаточно изобретателен. Добавлено через 2 минуты
1
|
|||
|
|
|||
| 16.10.2020, 14:06 | |||
|
Добавлено через 47 секунд
0
|
|||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 16.10.2020, 14:08 | ||
|
Я говорил о том, злом является мешать в одну кучу контролируемые логикой программы исключительные ситуации и неконтролируемые в общем случае аппаратно-системные реакции на ошибочный код. В управляемых средах все ошибки могут быть контролируемы логикой программы. Это гарантирует среда исполнения. Поэтому там это нормально.
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 16.10.2020, 15:16 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 09.10.2020
Сообщений: 26
|
|
| 16.10.2020, 19:46 [ТС] | |
|
"То есть речь о том, что формула встраивается из независимо скомпилированного плагина, и в этой формуле могут быть ошибки, правильно?"
Да. Более подробно: передаётся извне адрес скомпилированного кода, производящий вычисления. Процедура proc выглядит так: long double eval(PVOID addr); { asm call addr end; } Вычисления eval в большинстве случаев происходят в цикле с изменяющимися переменными. long double res; for(...) { x1 = ...; x2 = ...; ... res = ...eval(addr)...; //выражение, содержащее eval } x1,x2,... - переменные , участвующие в вычислениях в переданном извне скомпилированном коде. Возможные типы этих переменных: целые, с плавающей точкой, массивы .. func(x1,x2,...i1,i2,...v1,v2,...) Передаётся адрес 'addr' этой функции, но переменные, участвующие и в основной программе и в этой функции - общие. В ходе расчётов могут возникать различные исключения: FPU и AccessViolation <- но это исключение уже будет ошибкой программиста, а не вычислительной. При исключении нужно выдать подробную информацию с мгновенными значениями переменных. При этом, программа не должна аварийно завершаться. Поэтому удобно обернуть весь этот цикл в блок: На Дельфи: try //условный пример: for i = 0 to N do begin x1:=i*1.25; x2:=x1*sin(x1) res:=res+eval(addr); end; except on E: EZeroDivide do ErrorCode:=E_ZeroDivide; on E: EInvalidOp do ErrorCode:=E_InvalidOp; on E: EOverFlow do ErrorCode:=E_OverFlow; on E: EAccessViolation do ErrorCode:=E_AccessViolation; end;
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|||||||
| 16.10.2020, 21:02 | |||||||
Поэтому единственный надежный вариант, выносить все опасные вычисления в другой процесс. Анализировать состояние процесса на предмет возникновения в нем нештатных ситуаций. С основным приложением организовать взаимодействие через один из доступных вариантов IPC. Да, это гораздо сложнее сделать, чем то, на что вы рассчитывали, но только так это не будет профанацией. Также существуют готовые решения по предоставлению безопасного окружения для непроверенных вычислений. Можно погуглить по ключевому слову "Sandboxing" (или начать отсюда). Вот пример такого решения: https://github.com/google/sandboxed-api
1
|
|||||||
|
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
|
|||||||
| 18.10.2020, 09:55 | |||||||
0
|
|||||||
| 18.10.2020, 09:55 | |
|
Gcc и обработка исключений try, throw, catch...обработка исключений
Обработка исключений Конструкция try.catch.finally Отлов исключений без использования try/catch Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|