c# – 在Winforms-MVP和WPF-MVVM中通知最终用户异常

在半年的Winforms-MVP中,我设计了以下异常处理策略.我有一个基本的抽象Presenter类,其中有几个Execute方法将一个委托作为输入参数(签名各不相同). View和Presenter之间的交互是通过IView中定义的事件(输入)完成的,并通过设置公共属性(输出)或调用IView中定义的方法并由View实现.演示者中的每个事件处理程序都会调用其中一个Execute方法,为其提供具体的实现.

在execute方法中,我有几个catch块,用于可能发生的非常明确的异常(主要是因为广泛使用的外部组件中的一些问题).这些异常中的每一个都会停止执行当前操作,通过调用View的方法记录并向用户显示有意义的解释.

不久前(事实上很久以前)我开始学习WPF-MVVM,乍一看似乎与MVP有很多共同之处.我正在寻找关于那里的异常处理策略的一些方便的建议(主要告知用户有关问题),但这个问题一般难以搜索 – 我的意思是说,但主要是原则上.我已经在app.xaml.cs中找到了20多个“处理”未处理异常的例子,这一切都非常好,但请真诚地告诉我 – 如果你知道可能导致应用程序崩溃的确切异常,你不会处理它们吗?稍早一点(即使你将被迫关闭你的应用程序)?我不喜欢抓住所有可能的异常.应该在不关闭应用程序的情况下处理由网络问题,临时数据库不可用等引起的大量异常,而不会出现可怕的错误图标,从而使普通用户有机会重复他的请求.

因此,作为一个实验,我尝试了几乎与之前描述的相同的事情 – 我在ViewModel中创建了事件,用于异常转换和订阅View.但是,坦率地说,这种方式让我感到毛骨悚然.

(这是一个非常长的演讲,我知道)问题:在使用MVVM时,如何处理有关通知用户的异常?不,我现在对数据验证不感兴趣.任何关于MVP的批评和/或建议也是受欢迎的.

最佳答案
对于我们的Wpf应用程序中的不同类型的错误条件,我们有几种不同的策略.

对于代码可以在不通知用户的情况下处理和继续的预期错误,我们执行正常的Try Catch块.

对于预期但从用户角度导致失败的错误,我们在ViewModel上公开了一个Notifications集合,绑定到View上的ItemsControl,其模板方式类似于Firefox / IE /中的通知栏.铬.每个通知都有一个show duration属性(Notifications集合使用调度程序计时器进行自修剪)和视图中的关闭按钮,以便它们可以显示特定的时间段,或者可以由用户显式关闭.关于这个模型的好处是它可以用于完成消息,警告和异常 – 以及一些可能不会表现为异常但从用户的角度来看仍然是错误条件的条件.通知通常是消息框的良好替代品,因为它们不会中断用户工作流程.

对于我们没有预料到的错误,我们使用Red Gate SmartAssembly来捕获完整的详细信息,以便用户可以将它们发送给我们的分析支持.我们的观点是,在您未预料到的异常之后捕获并继续您的应用程序是一个非常冒险的策略 – 来自意外异常的堆栈未解除,并且您的应用程序将在错误之后处于不一致状态(这可能导致任何东西,从奇怪的用户界面到腐败的数据),可能会有无法预测的副作用.让应用程序崩溃并不是一个很好的用户体验,但由于应用程序忽略了错误导致的意外状态,因此使数据损坏的情况要糟糕得多.我们的策略是捕获有关崩溃的详细信息,以便用户知道我们对解决问题非常认真,并且我们将在未来的更新中修复/捕获它 – 而不是仅仅继续并针对潜在的更糟糕的问题.

转载注明原文:c# – 在Winforms-MVP和WPF-MVVM中通知最终用户异常 - 代码日志