有没有办法用MVVM模式实现全局异常处理。在我现有的情况下,每当ViewModel内部发生错误时,应用程序都不会崩溃,只是"隐藏"在导致错误的代码之后发生的其余绑定(当然这对最终用户来说非常误导,而不是真的,并且永远不会发生这种情况)。我不想为viewModel中的每个操作实现try catch,我不喜欢错误异常的无声方式,我真的很想为WPF应用程序实现一种处理全局错误的方法。有没有办法用MVVM做到这一点?
答案 0 :(得分:1)
经过长时间的战斗后,我终于找到了一种在ViewModel中实现处理异常的简单方法。虽然创建一个继承自DefaultTraceListener的BindingListener当然是在调试模式下查找绑定错误的好方法,但是当运行解决方案是标准模式时,这不会捕获ViewModel内部发生的异常。但AppDomain.CurrentDomain.FirstChanceException将会。
App.xaml.cs:
main.html
答案 1 :(得分:1)
您可以将每个方法包装在lamba中。像这样......
public async void DoSomething()
{
await RunSafe(async () =>
{
await model.DoSomething();
await model.DoSomethingElse();
await model.DoLastThing();
});
}
private async Task RunSafe(Func<Task> del, [CallerMemberName] String methodName = "")
{
try
{
Log.Info("Executing {0}", methodName);
await del();
}
catch (Exception ex)
{
StatusMessage = string.Format("Error in {0}(...): {1}\r\n{2}", methodName, ex.Message, ex.ToString());
Log.Error("Error occured in plug in.", ex);
}
}
答案 2 :(得分:0)
查看派生DefaultTraceListener
类。我看到人们从中派生出自己的BindingListener
,并覆盖WriteLine
方法以抛出自己的异常。
你可以在应用程序启动期间启动其中一个,它应该是自己的:
public class BindingListener : DefaultTraceListener`
{
public BindingListener()
{
PresentationTraceSources.Refresh();
PresentationTraceSources.DataBindingSource.Listeners.Add(this);SourceLevels.Error;
}
public override void WriteLine(string message){...}
}
注意:这可能不是完全您想要的开箱即用,您可能需要修改一些道具。