使用Caliburn.Micro的WPF应用程序中的全局处理异常

6 wpf exception-handling caliburn.micro

嗨,我尝试从我的WPF应用程序实现此站点的解决方案,以进行全局异常处理.

http://www.codeproject.com/Articles/90866/Unhandled-Exception-Handler-For-WPF-Applications.aspx

我使用Caliburn Micro作为MVVM框架.服务我在外部装配中,它在MEF的视图模型类中注入.

这是我在WPF应用程序中实现全局异常处理的实现.

App.xaml中

         DispatcherUnhandledException="Application_DispatcherUnhandledException"
         Startup="Application_Startup"
Run Code Online (Sandbox Code Playgroud)

App类:

public partial class App : Application
{
    private IMessageBox _msgBox = new MessageBoxes.MessageBoxes();

    public bool DoHandle { get; set; }

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    }

    private void Application_DispatcherUnhandledException(object sender,
                           System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        if (DoHandle)
        {
            _msgBox.ShowException(e.Exception);
             e.Handled = true;
        }
        else
        {
            _msgBox.ShowException(e.Exception);
            e.Handled = false;
        }
    }


    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        var ex = e.ExceptionObject as Exception;
        _msgBox.ShowException(ex);
    }


}
Run Code Online (Sandbox Code Playgroud)

外部装配的服务方法:

    public void ServiceLogOn()
    {
        try
        {

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
Run Code Online (Sandbox Code Playgroud)

此服务方法是在视图模型类中调用,例如在按钮单击事件上:

    [Export(typeof(ILogOnViewModel))]
    public class LogOnViewModel : Screen, ILogOnViewModel
    {
        public void LogOn()
        {
            _service.ServiceLogOn();
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 我在Visual Studio中运行WPF应用程序,并在ServiceLogOn方法中生成带有"Bad credentials"消息的异常.

    我希望我看到带有异常的消息框.

    但Visual Studio停止在服务项目中调试app并显示服务方法中的异常.

  2. 所以我尝试从exe文件运行WPF并在ServiceLogOn方法中产生相同的异常.

    我收到此错误:

    异常是按调用目标抛出的.

视图模型类中的任何异常都不会在方法中处理:

  • Application_DispatcherUnhandledException
  • 或CurrentDomain_UnhandledException.

在App类中.

我做得不好?

与Simon Fox的回答一起编辑.

我尝试在Simon Fox的MEF bootstraper建议中实现,但我仍然做错了.我在bootstraper类中将异常的句柄逻辑移动到OnUnhandledException方法.

这是我的bootstraper类的代码:

 public class MefBootStrapper : Bootstrapper<IShellViewModel>
    { 
//...
    private IMessageBox _msgBox = new MessageBoxes.MessageBoxes();

    public bool DoHandle { get; set; }

    protected override void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        if (DoHandle)
        {
            _msgBox.ShowException(e.Exception);
            e.Handled = true;
        }
        else
        {
            _msgBox.ShowException(e.Exception);
            e.Handled = false;
        }

    }
//...
    }
Run Code Online (Sandbox Code Playgroud)

我从按钮上的视图模型绑定一些方法并抛出新的异常.像这样的东西:

public void LogOn()
{
    throw new ArgumentException("Bad argument");
}
Run Code Online (Sandbox Code Playgroud)

但结果是山姆,我从Visual Studio测试应用程序并获得此异常.

异常是按调用目标抛出的.

Sim*_*Fox 16

Caliburn.Micro已经支持挂钩未处理的异常.Bootstrapper类(每个Caliburn项目都需要)为您设置并提供virtual OnUnhandledException方法.

在您的自定义中,BootStrapper您必须override OnUnhandledException对应用中的未处理异常执行任何自定义操作.请注意,您很可能必须编组操作,例如向UI线程显示消息框(Caliburn可以轻松实现此功能Execute.OnUIThread).

您的服务将异常移动到客户端的方式也可能存在问题,但是没有任何有关服务如何实现/托管等的详细信息我无能为力.您是否使用WCF来执行SOAP?你在使用FaultContracts吗?