Подтвердить что ты не робот

Предотвращение исключения из стороннего компонента сбоя всего приложения

Я пишу многопоточное приложение, которое полагается на некоторые сторонние библиотеки DLL. Моя проблема заключается в том, что при использовании объекта из сторонней библиотеки, если он вызывает исключение во время работы, я не могу его поймать, он пузырится и убивает все приложение. У меня много разных потоков, каждый из которых использует свой собственный объект из этой сторонней библиотеки, и мне нужен поток, который использует эту копию объекта, чтобы иметь возможность поймать и обработать исключение.

Основываясь на том, что я читал, похоже, что, скорее всего, сторонняя библиотека фактически создает свои собственные потоки и разрешает неперехваченные исключения. Поведение .NET 2.0+ позволяет этим исключениям убивать все приложение. Я знаю об AppDomain.CurrentDomain.UnhandledException, но это не позволяет вам отключить завершение работы приложения.

Для справки, я пишу консольное приложение в .NET 4.0. Есть ли у кого-нибудь решение или совет, чтобы остановить эти исключения от убийства моего приложения?

4b9b3361

Ответ 1

Одна вещь, на которую вы можете обратить внимание, - это атрибут HandleProcessCorruptedStateExceptionsAttribute.

Я не знаю, является ли это вашей проблемой или нет, но я должен был использовать этот атрибут недавно для метода, вызывающего функцию в стороннем COM-объекте. Этот атрибут новичок в .net 4.0. Мое основное понимание заключается в том, что платформа 4.0 по умолчанию не создаст исключение, возникшее в определенных ситуациях, когда, по его мнению, исключение третьей стороны может привести к некоторой нестабильности. Я думаю, что это относится главным образом к ситуациям, когда сторонний компонент неуправляем. Я не уверен, но он решил мою проблему.

Использование выглядит следующим образом:

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute()]
private void ThirdPartyCall()
{
    try
    {
            return Call3rdPartyFunction()
    }
    catch (Exception exInstantiate)
    {
        ...
    }
}

Дополнительная информация: http://msdn.microsoft.com/en-us/magazine/dd419661.aspx