В настоящее время я пишу приложение winforms (C #).
Я использую Блок обработки исключений Enterprise Library, следуя довольно стандартному подходу из того, что я вижу. IE: в методе Main в Program.cs я подключил обработчик событий к событию Application.ThreadException и т. Д.
Этот подход хорошо работает и обрабатывает приложения в исключительных обстоятельствах.
В один из моих бизнес-объектов я добавляю различные исключения в средство доступа Set одного из свойств объекта
set {
if (value > MaximumTrim)
throw new CustomExceptions.InvalidTrimValue("The value of the minimum trim...");
if (!availableSubMasterWidthSatisfiesAllPatterns(value))
throw new CustomExceptions.InvalidTrimValue("Another message...");
_minimumTrim = value;
}
Моя логика для этого подхода (без превращения его в обсуждение «когда генерировать исключения») заключается в том, что бизнес-объекты отвечают за проверку ограничений бизнес-правил и генерируют исключение, которое может всплыть и быть перехвачено по мере необходимости. Следует отметить, что в пользовательском интерфейсе моего приложения я явно проверяю значения, для которых устанавливается общедоступное свойство (и выполняю там действия, отображая дружественный диалог и т. Д.), Но, выбрасывая исключение, я также освещаю ситуацию, когда мой бизнес-объект может не использоваться пользовательским интерфейсом, например: свойство устанавливается, например, другим бизнес-объектом. В любом случае, я думаю, вы все поняли идею.
Моя проблема в том, что эти исключения не перехватываются обработчиком, подключенным к Application.ThreadException, и я не понимаю, почему.
Из прочтенного прочтения я сделал событие Application.ThreadException, и оно обрабатывает "... перехватывает все исключения, возникающие в основном потоке графического интерфейса". Разве исключения, возникающие в моем бизнес-объекте, не находятся в этой теме? Я не создал ни одной новой темы.
Я могу получить подход к работе, если я обновлю код следующим образом, explicity вызывая обработчик событий, связанный с Application.ThreadException. Этот подход описан в примерах библиотеки предприятия. Однако этот подход требует, чтобы я обернул все исключения, сгенерированные в try catch, чего я пытался избежать, используя для начала «глобальный» обработчик.
try
{
if (value > MaximumTrim)
throw new CustomExceptions.InvalidTrimValue("The value of the minimum...");
if (!availableSubMasterWidthSatisfiesAllPatterns(value))
throw new CustomExceptions.InvalidTrimValue("Another message");
_minimumTrim = value;
}
catch (Exception ex)
{
Program.ThreadExceptionHandler.ProcessUnhandledException(ex);
}
Я также исследовал использование привязки обработчика к событию AppDomain.UnhandledException, но это также не перехватывает исключения.
Было бы хорошо, если бы кто-нибудь мог объяснить мне, почему мои исключения не перехватываются моим глобальным обработчиком исключений в первом примере кода. Есть ли другой подход, который мне не хватает, или я застрял с упаковкой кода в try catch, показанном выше, как требуется?