0 / 0 / 0
Регистрация: 29.04.2019
Сообщений: 43
1
.NET 4.x

Не перехватывается ThreadAbortException

25.08.2020, 22:08. Показов 1144. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу, в которой используется дополнительный
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2020, 22:08
Ответы с готовыми решениями:

ThreadAbortException не обработано
Здравствуйте. Возникла такая проблема. В отдельном потоке Thread создаётся и открывается форма....

Отловить ошибку System.Threading.ThreadAbortException
Необработанное исключение типа "System.Threading.ThreadAbortException" в System.Drawing.dll ...

ThreadAbortException- исключение, генерируемое при Abort; а где оно, собственно?
Да, где? ...Вот изучил многопоточность у Гербердта Шилдта. Он пишет (про прерывание потоков): В...

Не перехватывается исключений
int a; try{ cin >> a; cout << a / 0 << endl; }catch(...){ cout << "err" << endl./ }

6
Эксперт .NET
6316 / 3935 / 1577
Регистрация: 09.05.2015
Сообщений: 9,237
25.08.2020, 22:11 2
Поток нормально завершите и не надо будет ничего перехватывать.
0
0 / 0 / 0
Регистрация: 29.04.2019
Сообщений: 43
25.08.2020, 23:32  [ТС] 3
Извиняюсь, случайно создал тему, не завершив описание.
Функция, выполняемая в отдельном потоке использует следующую конструкцию:

C#
1
2
3
4
5
6
7
8
9
10
11
12
private void Calculate(object calcObj)
        {
                        //здесь было преобразование calcObj в calc
            try
            {
                calc.calculateAll();
            }
            catch
            {
                Thread.ResetAbort();
            }
        }
При вызове abort() из основного потока, прога падает, а вижуалка показывает исключение внутри calculateAll. "Нормальное" завершение потока в данном случае не совсем применимо, т.к. в потоке нет единого цикла, который можно было бы прервать по флагу. Функция calculateAll достаточно массивная, в ней много длительных циклов. Кроме того, не хочется ради этого выносить объект calc в глобальные переменные.

Добавлено через 1 час 7 минут
Обнаружил, что не перехватываются вообще никакие исключения внутри функции calculateAll
0
Эксперт .NET
6316 / 3935 / 1577
Регистрация: 09.05.2015
Сообщений: 9,237
25.08.2020, 23:58 4
Цитата Сообщение от nneekkiitt Посмотреть сообщение
"Нормальное" завершение потока в данном случае не совсем применимо, т.к. в потоке нет единого цикла, который можно было бы прервать по флагу.
Цитата Сообщение от nneekkiitt Посмотреть сообщение
Функция calculateAll достаточно массивная, в ней много длительных циклов.
Вы сами себе противоречите... Что мешает в самый глубокий цикл запихнуть
C#
1
2
if (flag)
   return;
?
0
0 / 0 / 0
Регистрация: 29.04.2019
Сообщений: 43
26.08.2020, 13:30  [ТС] 5
Цитата Сообщение от Someone007 Посмотреть сообщение
Вы сами себе противоречите... Что мешает в самый глубокий цикл запихнуть
Мешает то, что поток может надолго повиснуть во многих местах, и если я начну раскидывать туда флаги, то наверняка что-то упущу. Кроме того, там достаточно сложная логика, и флаги придется выставлять не только в циклах, но и во всех функциях, которые находятся выше по иерархии. С таким подходом прерывание по флагу может само по себе привести к вылету, если я поставлю флаги не везде. Тут дело в том, что изначально этот класс не планировалось запускать в отдельном потоке, но вычисления занимают достаточно много времени, и это вынужденная мера.

Я выяснил, что проблема не в коде, а в самой вижуалке, т.к. если запускать вне её, то прога не падает и все работает корректно
0
Эксперт .NET
6316 / 3935 / 1577
Регистрация: 09.05.2015
Сообщений: 9,237
26.08.2020, 13:36 6
Лучший ответ Сообщение было отмечено nneekkiitt как решение

Решение

Цитата Сообщение от nneekkiitt Посмотреть сообщение
Я выяснил, что проблема не в коде, а в самой вижуалке, т.к. если запускать вне её, то прога не падает и все работает корректно
Так может и нет проблемы? VS останавливается на исключениях, выбранных в настройках отладчика независимо от того перехватываете вы их или нет.
1
0 / 0 / 0
Регистрация: 29.04.2019
Сообщений: 43
26.08.2020, 14:33  [ТС] 7
Цитата Сообщение от Someone007 Посмотреть сообщение
Так может и нет проблемы? VS останавливается на исключениях, выбранных в настройках отладчика независимо от того перехватываете вы их или нет.
Действительно, изменил настройки отладчика и все заработало
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2020, 14:33
Помогаю со студенческими работами здесь

Пользовательское исключение не перехватывается
Всем привет, возникли два вопроса по этому коду в строке: if (num = 0 ) throw new NullException();...

OnKeyDown формы перехватывается кнопкой
У меня есть форма(C++Builder 6),с обработчиком событий OnKeyDown, так же на этой форме размещена...

Почему не перехватывается исключение типа double?
#include <iostream> #include <conio.h> #include <cstring> using namespace std; void obrob(int...

Буфер обмена, перехватывается микрософтовскими программами
Привет форумчане, суть вопроса состоит в том, что моя программа, перехватывает картинку с веб...

не перехватывается исключение, хоть по книге c++ за 21 день и должно
#include <exception> #include <iostream> #include <string> using namespace std; class...

Почему в async void методе не перехватывается исключение?
Привет! В ряде статей читал о том, что в подобном случае исключение не перехватывается и...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru