Чтобы поймать любое неисследованное исключение, я подписываю обработчик на 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)"?