Как перехватить исключение в WinForms, когда есть много действий, которые являются асинхронными операциями - PullRequest
0 голосов
/ 07 августа 2009

У меня много асинхронных операций в разных классах.

При ошибке выдается специальное исключение, которое унаследовано от System.Exception.
В какой-то форме я хочу поймать это с помощью messageBox.

Функция «Application.ThreadException» не может ее перехватить.

Другими словами, я не могу перехватить все исключения функцией, когда выдается какое-то исключение Как я могу это сделать?

Ответы [ 4 ]

4 голосов
/ 07 августа 2009

Подписаться на Application.UnhandledException, оно запускает любое необработанное исключение и предоставляет объект исключения с подробностями в EventArgs.

2 голосов
/ 07 августа 2009

По сути, вы должны обрабатывать исключения для каждого потока, с Application.ThreadException в качестве крайней меры.

Как это сделать, зависит от того, какой шаблон Async вы используете, но, например, при использовании IAsyncResult исключение «сохраняется» для вас и выдается при вызове EndIvoke (.., iar)

0 голосов
/ 07 августа 2009

Исключения являются плохими в приложениях ASync, поскольку исключения могут обрабатываться только по одному во всех потоках (из MSDN). В настоящее время вы можете справиться с событиями / делегатами.

VS2010 имеет новый обработчик исключений для обработки многопоточных исключений.

0 голосов
/ 07 августа 2009

Как уже сказал Хенк Холтерман, вы должны обрабатывать исключения. Только те грязные, которые не обработаны, должны быть оставлены для Application.ThreadException. Если вы этого не знаете, хотя вы сможете отобразить свое сообщение в методе обработки событий Application.ThreadException, приложение затем прекратит работу . Определенные исключения не фиксируются Application.ThreadException, и вам придется обрабатывать событие AppDomain.UnhandledException. AFAIK Лучше не бросать исключения в обработчики Async (гуру, поправьте меня, если я ошибаюсь). Лучший способ справиться с ними - это генерировать исключения, когда пользователь вызывает end end, или когда пользователь пытается получить объекты ответа. Обратите внимание, если вы throw exc объект из одного потока, он не будет пойман в другом потоке. Таким образом, информировать основной поток одним из способов было бы вызвать событие (к которому подключен основной поток), в котором вы передаете объект ответа. Если произошла ошибка, вызовите исключение в получателе объекта ответа, иначе верните объект ответа. Другой способ - просто вызвать событие, которое сообщит основному потоку об исключении.

EDIT: Только что увидел ваш комментарий:

мы можем поймать исключение и перенаправить страница на страницу ошибок в asp.net установка данных об ошибках в web.config. как сделать в winform?

Нет прямого способа сделать это в winforms. У меня есть один метод HandleError на каждый поток. Этот метод будет принимать объект исключения в качестве параметра и проверять тип исключения, отображать окно сообщения и / или регистрировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...