您好我尝试在我的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"
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);
}
}
外部装配的服务方法:
public void ServiceLogOn()
{
try
{
}
catch (Exception ex)
{
throw ex;
}
}
此服务方法是在视图模型类中调用,例如按钮单击事件:
[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen, ILogOnViewModel
{
public void LogOn()
{
_service.ServiceLogOn();
}
}
我在Visual Studio中运行WPF应用程序,并在ServiceLogOn方法中生成带有“Bad credentials”消息的异常。
我希望我看到带有例外的消息框。
但Visual Studio停止调试应用程序并在服务项目中的服务方法中显示异常。
所以我尝试从exe文件运行WPF并在ServiceLogOn方法中产生相同的异常。
我收到此错误:
异常是按调用目标抛出的。
视图模型类中的任何异常都不在方法中处理:
在App类中。
我做得不好?
以西蒙福克斯的回答编辑。
我尝试在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;
}
}
//...
}
我从按钮上的视图模型绑定一些方法并抛出新的异常。像这样:
public void LogOn()
{
throw new ArgumentException("Bad argument");
}
但结果是山姆,我从Visual Studio中测试应用程序并获得此异常。
异常是按调用目标抛出的。
答案 0 :(得分:16)
Caliburn.Micro已经内置支持挂钩未处理的异常。 Bootstrapper类(每个Caliburn项目都需要)为您设置此类并提供virtual
OnUnhandledException
方法。
在自定义BootStrapper
中,您必须override
OnUnhandledException
对应用中未处理的例外执行任何自定义操作。请注意,您很可能必须编组操作,例如向UI线程显示消息框(Caliburn可以通过Execute.OnUIThread
轻松实现此功能)。
您的服务将异常移至客户端的方式也可能存在问题,但是没有任何有关服务如何实现/托管/等的详细信息我无能为力。您是否使用WCF来执行SOAP?您使用的是FaultContracts吗?