嗨,我尝试从这个站点实现解决方案,我的 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 停止调试应用程序并在服务项目的服务方法中显示异常。
我收到此错误:
调用的目标已抛出异常。
View 模型类的任何异常都不会在方法中处理:
在 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/