2016-11-18 4 views
0

Я оцениваю Postharp для развертывания в приложении. Я хотел бы обрабатывать все неперехваченные исключения в моем приложении с postsharp Таким образом, я реализовал метод OnException в дочернем классе OnExceptionAspect. С моими испытаниями все исключения пойманы, за исключением одного исключения в одном случае: , когда исключение выбрасывается в backgroundWorker.Обработка исключения в C# backgroundWorker

мой класс:

public class Test { 
    public void MethodTest() { 

    //... 
    // if I throw an exception here, no problem : postsharp aspect intercept 
    // below, postsharp don't intercept the exception : 
    BackgroundWorker bgw = new BackgroundWorker() ; 
    bgw.DoWork += (object sender2, DoWorkEventArgs e2) => { 
     //... 
     throw new NotImplementedException(); 
    } 
    bgw.RunWorkerAsync(); 
    } 
} 

Может у вас есть предложение для перехвата этого исключения?

Благодарим за помощь.

+1

Привет, добро пожаловать в Stack. Не страшный первый вопрос, но я немного изменил ваш заголовок и изменил ваши флаги. Вы просто пытаетесь обработать исключение, созданное фоновым рабочим, это, по сути, дубликат вопроса [this] (http://stackoverflow.com/questions/20582253/background-worker-exception-handling). –

+0

Обработка исключений Catch-em-all - это * ужасная практика, особенно если вы еще недостаточно понимаете исключения. Вместо этого запишите обработчик событий для события AppDomain.CurrentDomain.UnhandledException. –

+0

В моем контексте (addin Microsoft Word) невозможно перехватить событие AppDomain.CurrentDomain.UnhandledException. поэтому, чтобы обеспечить безопасность пользователя, необходимо перехватить необработанное исключение для отправки в Репозиторий исключения приложений. Хорошим способом является использование Postsharp для централизации отправки исключающего исключения из Решения для исключения приложений. Но похоже, что Postsharp не перехватывает исключение BackGroundWorker. – Christ121212

ответ

0

Поскольку метод преобразования, преобразованный PostSharp в стек вызовов при вызове исключения, не выполняется вообще. Получение аспект для работы именно с этим кодом без каких-либо прямых изменений немного сложно, но возможно.

По умолчанию многоадресная рассылка PostSharp не применяет аспекты к анонимным методам и другому (VB или C#) компилятору. Хотя вы можете заставить PostSharp применять эти методы, это не рекомендуется.

Другой способ - нацелить непосредственно BackgroundWorker и его DoWork событие. Хотя вы не можете напрямую изменить реализацию, вы можете перехватить вызовы методов события из вашего кода. Ниже приведена простая реализация такого перехвата, который обертывает входящий делегат, чтобы он мог быть перехвачен вашим аспектом (MyOnExceptionAspect): public class EventInterceptionProxy { { } частный обработчик DoWorkEventHandler;

public EventInterceptionProxy(DoWorkEventHandler handler) 
    { 
     this.handler = handler; 
    } 

    [MyOnExceptionAspect] 
    public void Intercept(object sender, DoWorkEventArgs ea) 
    { 
     handler?.Invoke(sender, ea); 
    } 
} 

[Serializable] 
public class AddHandlerInterception : MethodInterceptionAspect 
{ 
    public override void OnInvoke(MethodInterceptionArgs args) 
    { 
     args.Arguments[0] = 
      new DoWorkEventHandler(new EventInterceptionProxy((DoWorkEventHandler) args.Arguments[0]).Intercept); 

     args.Proceed(); 
    } 
} 

Вы можете применить аспект, используя следующие:

[assembly: AddHandlerInterception(
       AttributeTargetTypes = "System.ComponentModel.BackgroundWorker", 
       AttributeTargetAssemblies = "System", 
       AttributeTargetMembers = "add_DoWork")] 

Все вышеперечисленное кода просто демонстрация. Он не обрабатывает удаление обработчика и другие побочные случаи (использование в библиотеках PCL, безопасность потоков, слабые события ...).

Смежные вопросы