Как «глобально» перехватить исключения, генерируемые в экземплярах объектов - PullRequest
3 голосов
/ 02 марта 2009

В настоящее время я пишу приложение 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, показанном выше, как требуется?

Ответы [ 3 ]

0 голосов
/ 02 марта 2009

Согласно MSDN , Application.ThreadException будет срабатывать только в том случае, если исключение не обработано. Может быть, где-то в стеке вызовов находится catch, который обрабатывает исключение?

Другой вариант - использовать AppDomain.UnhandledException . Это то же самое, что и Application.ThreadException, за исключением того, что оно работает для всех исключений в том же AppDomain.

0 голосов
/ 25 марта 2010

Если вы пытаетесь использовать использовать Application.ThreadException или же AppDomain.CurrentDomain.UnhandledException Отладчик будет ловить исключение!

Для проверки этих методов вы должны запустить приложение без отладчика.

0 голосов
/ 02 марта 2009

В качестве мысли попробуйте добавить (довольно рано - т.е. в начале Main):

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Тем не менее, мне кажется, что это нормально работает с или без ...

...