powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
6 сообщений из 6, страница 1 из 1
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
    #38886982
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Описываю ситуацию. Есть кнопка на форме, которая, запускает задачу. Задача что-то обсчитывает, не важно что. После запуска задачи открывается окошко-прогрессбар. По ходу обсчета, задача кидает событие что-то типа "определенный этап обсчета завершен". Окошко-прогрессбар подписано на это событие и перерисовывает прогрессбар каждый раз. Вроде понятно.(?). По ходу обсчета, есесно, могут возникать исключительные ситуации. Так вот я хочу перехватывать исключения не в задаче, а в основном потоке. Погуглил. Советуют делать через ContinueWith. Работает, но мне не совсем нравится такой подход, потому что нет возможности использовать try-catch , приходится использовать if-else , что не радует. Может кто-то предложит лучший подход. А пока я делаю вот так.

Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
private void ClickHandler(Object sender, RoutedEventArgs e)
{
      var progressWindow = new ProgressBarWindow();

      Task.Factory.StartNew(MyTask).ContinueWith(tsk =>
      {
                var exception = tsk.Exception;
                if (exception == null) return;

                var exc = exception.InnerException;

                if (exc.GetType() == typeof (ArgumentNullException))
                {
                    Dispatcher.Invoke(new Action(() =>
                    {
                        MessageBox.Show("ArgumentNullException");
                        progressWindow.Close();
                    }));
                }
                else if (exc.GetType() == typeof (NullReferenceException))
                {
                    Dispatcher.Invoke(new Action(() =>
                    {
                        MessageBox.Show("NullReferenceException");
                        progressWindow.Close();
                    }));    
                }
                else if (exc != null)
                {
                    Dispatcher.Invoke(new Action(() =>
                    {
                        MessageBox.Show("Ошибка общего вида");
                        progressWindow.Close();
                    }));
                }
                else
                {
                   // Сюда вообще по идее никогда не зайдет 
                   Dispatcher.Invoke(new Action(progressWindow.Close));
                }
          }, TaskContinuationOptions.OnlyOnFaulted);
      progressWindow.ShowDialog();
}
...
Рейтинг: 0 / 0
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
    #38886998
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут описана работа с асинхронными операциями с помощью ContinueWith, в том числе описана обработка ошибок.

Если хочется try...catch, то есть смысл вместо ContinueWith использовать async/await.
...
Рейтинг: 0 / 0
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
    #38887099
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

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

ограничен четверным .нетом
...
Рейтинг: 0 / 0
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
    #38887179
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попутно вопрос: зачем разные типы исключений обрабатывать по разному? В большинстве случаев исключение:

1. Прерывает цепочку операций, синхронных или асинхронных, не важно.
2. Несёт в себе информацию об ошибке и месте её возникновения (stack trace) для записи в системный журнал (вывода message box на экран).

Специальные процедуры для обработки исключений разных типов требуются достаточно редко.
...
Рейтинг: 0 / 0
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
    #38887259
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

В зависимости от типа исключения хочу в messagebox показывать разные осмысленные сообщения, а не свойство Message из исключения. Ну вот просто надо и все :)

Чот пока не понял как вашу статью применить на свой случай...
...
Рейтинг: 0 / 0
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
    #38887561
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrillaАлексей К,

В зависимости от типа исключения хочу в messagebox показывать разные осмысленные сообщения, а не свойство Message из исключения. Ну вот просто надо и все :)

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

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

Но можно преобразовывать и в месте возникновения, внутри асинхронной операции:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Task.Factory.StartNew(() =>
{
    try
    {
        ExecuteOperation1()
    }
    catch(Exception e)
    {
        throw new InfoException("Произошла ошибка операции 1. До свидания!", e);
    }

    try
    {
        ExecuteOperation2()
    }
    catch(Exception e)
    {
        throw new InfoException("Произошла ошибка операции 2. До свидания!", e);
    }
})
.LogException(); // Логирование, расширяющий метод для Task
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]