c#应用程序范围处理程序(用于“任何东西”)? //类似Java的“拦截器”?

时间:2018-04-25 18:17:28

标签: c# events global handler

要捕获任何未捕获的异常,我正在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) )“处理程序?

0 个答案:

没有答案