c # Широкие обработчики приложений (для «чего угодно»)?// Java-подобные "перехватчики"? - PullRequest
0 голосов
/ 25 апреля 2018

Чтобы поймать любое неисследованное исключение, я подписываю обработчик на Main-Method(), например, так:

Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

Это прекрасно работает и ловит ЛЮБОЕ необработанное исключение (КРОМЕ StackOverflowException), независимо от того,UI-Thread или исключение Background-Thread.(Используется только для ведения журнала / отчетов об ошибках, например так:)

private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    //Log exception
    Log.e("Unhandled Background Thread Exception", e.Exception);

    //Show oops.
    ExceptionHandler eh = new ExceptionHandler();
    eh.Exception = e.Exception;
    eh.ShowDialog();
    eh.Dispose();
}

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //Log exception
    Log.e("Unhandled UI Thread Exception", (Exception)e.ExceptionObject);

    //Show oops.
    ExceptionHandler eh = new ExceptionHandler();
    eh.Exception = (Exception)e.ExceptionObject;
    eh.ShowDialog();
    eh.Dispose();
}

Однако, чтобы отследить проблему, обычно помогает выяснить, что делал пользователь ПЕРЕД появлением исключения ... Итак,Мне было интересно, есть ли «равный» способ подписаться на любое другое событие в приложении?

то есть что-то вроде глобального события:

Application.EveryButtonClick += Application_ButtonClicked;

...

private static void Application_ButtonClicked(Object sender, Args e, Method calledMethod){
   Log.Trace("User clicked on " + ((Button)sender).Name);

   calledMethod.Invoke(sender, e);
}

Или что-то, что называется Interceptor в Java-EE (Обрабатывается аннотациями)?

@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {

 logger.debug("LoggingInterceptor - before EJB method invoke: "
    + ctx.getMethod().getName());

 Object result = ctx.proceed(); //<-- Call initial method

 logger.debug("LoggingInterceptor - after EJB method invoke: " 
    + ctx.getMethod().getName() + " Call result was: " + result.toString());

 return result;
}

Иличто-то похожее?Есть несколько «событий», которые я хотел бы отследить с «глобальной» точки зрения ...


Пример довольно "маленький", и кнопки не так уж сложны в обработке.

Но, может быть, мне нужен глобальный обработчик "Listview_selected_index_changed (отправитель объекта, аргументы e, метод invokedMethod)"?

...