要捕获任何未捕获的异常,我正在Main-Method()
中订阅处理程序,如下所示:
Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
这非常正常,可以捕获任何未处理的异常(EXCEPT StackOverflowException
),无论是UI-Thread还是Background-Thread Exception。 (仅用于记录/错误报告,如下所示:)
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);
}
或者在Java-EE中称为Interceptor
的东西(通过注释处理)?
@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(对象发送者,args e,方法invokedMethod) )“处理程序?