MVVM中的全局异常处理

时间:2016-10-14 20:23:07

标签: c# wpf mvvm

有没有办法用MVVM模式实现全局异常处理。在我现有的情况下,每当ViewModel内部发生错误时,应用程序都不会崩溃,只是"隐藏"在导致错误的代码之后发生的其余绑定(当然这对最终用户来说非常误导,而不是真的,并且永远不会发生这种情况)。我不想为viewModel中的每个操作实现try catch,我不喜欢错误异常的无声方式,我真的很想为WPF应用程序实现一种处理全局错误的方法。有没有办法用MVVM做到这一点?

3 个答案:

答案 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){...}
}

注意:这可能不是完全您想要的开箱即用,您可能需要修改一些道具。