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

标签 wpf exception-handling caliburn.micro

嗨,我尝试从这个站点实现解决方案,我的 WPF 应用程序用于全局异常处理。

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

我使用 Caliburn Micro 作为 MVVM 框架。我在外部程序集中拥有的服务,它被注入(inject)到带有 MEF 的 View 模型类中。

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

应用程序.xaml

         DispatcherUnhandledException="Application_DispatcherUnhandledException"
         Startup="Application_Startup"

应用类:
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);
    }


}

来自外部程序集的服务方法:
    public void ServiceLogOn()
    {
        try
        {

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

此服务方法在 View 模型类中调用,例如在按钮单击事件上:
    [Export(typeof(ILogOnViewModel))]
    public class LogOnViewModel : Screen, ILogOnViewModel
    {
        public void LogOn()
        {
            _service.ServiceLogOn();
        }
    }
  • 我在 Visual Studio 中运行 WPF 应用程序,并在 ServiceLogOn 方法中产生带有“错误凭据”消息的异常。

    我希望看到异常的消息框。

    但是 Visual Studio 停止调试应用程序并在服务项目的服务方法中显示异常。
  • 所以我尝试从 exe 文件运行 WPF 并在 ServiceLogOn 方法中产生相同的异常。

    我收到此错误:

    调用的目标已抛出异常。

  • View 模型类的任何异常都不会在方法中处理:
  • Application_DispatcherUnhandledException
  • 或 CurrentDomain_UnhandledException。

  • 在 App 类中。

    我做什么坏事?

    用西蒙福克斯的回答编辑。

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

    这是我的 Bootstrap 类的代码:
     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;
            }
    
        }
    //...
        }
    

    我在按钮上绑定(bind)了 View 模型中的一些方法并抛出了新的异常。像这样的东西:
    public void LogOn()
    {
        throw new ArgumentException("Bad argument");
    }
    

    但是结果是一样的,我从 Visual Studio 中测试了应用程序并得到了这个异常。

    调用的目标已抛出异常。

    最佳答案

    Caliburn.Micro 内置了对 Hook 未处理异常的支持。 Bootstrapper 类(每个 Caliburn 项目都需要)为您设置它并提供 virtual OnUnhandledException方法。

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

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

    关于wpf - 使用 Caliburn.Micro 的 WPF 应用程序中的全局处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886876/

    相关文章:

    c# - 从 ResourceStream 获取图标

    wpf - 为什么应该为 WPF、SL 和 WP7 使用 UI 模式框架?

    c# - 如何将 View 模型的 caliburn.micro 绑定(bind)到组合框选择的值?

    c# - 在基于 View 的WPF应用程序中从ViewModel更改 View

    c# - 如何在 wpf 中使用 RelayCommand?

    c# - WPF自定义控件设计错误

    asp.net - ASP.NET MVC 5中的ErrorHanldeAttribute或OnException方法未处理异常

    c# - 如果 MSDN 中没有记录,如何确定某个方法可以抛出哪些异常?

    .net - 是否可以将网络异常用于控制流?

    wpf - 使用 Mahapps.Metro 在 WPF 中设计汉堡菜单