【问题标题】:Exception Handling in WinForms/WPFWinForms/WPF 中的异常处理
【发布时间】:2014-01-14 09:13:40
【问题描述】:

在 WinForms 或 WPF 中处理异常的最佳实践是什么。到目前为止,我还没有找到令人满意的解决方案。有人建议捕获未处理的异常事件。但我认为这不是一个好的解决方案。

问题

我有一个 3 层应用程序。持久层、业务层和ui层。我认为捕获异常的正确位置是在 ui 层中,而不是在所有三层中捕获异常。所以用户会收到一条错误消息,也许还有一种方法可以让用户“解决”问题(错误的数据输入等)。

所以问题是,用 try catch 块包围每个 ui-eventhandler(单击事件、选择更改事件等)的最佳/正确方法是什么?像这样:

private void button_MouseUp(object sender, MouseButtonEventArgs e)
{
   try
   {
      /// ...
   }
   catch (Exception ex)
   {
      // log exception
      // show error to user if necessary
   }
}

我知道捕获所有异常是不好的。当然,您需要通过验证用户输入数据来防止异常。但有时会有错误;)。

想象以下情况: 用户进行了一些尚未保存的更改。然后他点击一个按钮,在按钮处理程序中是一个错误。那么显示错误信息,让用户决定何时退出应用程序,这样用户不会丢失未保存的数据不是更好吗?

【问题讨论】:

  • 'Every' 超出了顶部,不建议捕获所有类型(例外)。
  • 最佳实践是在导致错误时防止用户操作:例如:当没有选择任何内容并且用户单击时,您可以处理可能获得的空引用,或者您可以确保在选择某些内容之前,该按钮处于禁用状态。这种方法适用于很多情况。
  • 我知道不建议捕获所有类型的异常。是的,防止错误是一种很好的做法。但是想象一下用户做了一些更改,这些更改还没有保存到数据库中。然后用户点击一个按钮。按钮处理程序有一个错误,因此应用程序崩溃。显示错误消息并让用户决定何时退出应用程序不是更好吗?使用这种方法,用户将有机会保存更改。

标签: c# wpf winforms exception


【解决方案1】:

所以问题是,用 try catch 块包围每个 ui-eventhandler(单击事件、选择更改事件等)的最佳/正确方法是什么?

没有。您唯一要做的就是重复自己(违反 DRY)。如果您将来想要更改记录异常的方式,则必须遍历每个具有 try/catch 块的方法。

您可以使用Application.ThreadException 事件来捕获所有未处理的异常(在 UI 线程中)以向用户显示错误对话框并记录异常。

最好的方法当然是通过验证来确保用户提供了正确的信息。通过这样做,所有发生的异常都是真正的异常,而不是您可以阻止的事情。

这是我的黄金法则:

  1. 始终尝试通过确保提供的数据正确来防止出现异常。
  2. 仅捕获可用于解决问题而无需用户参与的异常。
  3. 对所有其他错误使用Application.ThreadException 事件(并记录它们)。

如果您愿意,可以阅读我的例外系列:http://blog.gauffin.org/2013/04/what-is-exceptions/

【讨论】:

  • 我已经编辑了这个问题。当您想让用户有机会保存他所做的更改时,您会怎么做?重复的事情正是为什么我在每个 ui 事件中都与 try catch 块作斗争的原因。我没有在每个 catch 块中编写 logger.log(...),而是创建了一个 ExceptionUI 控件,该控件记录/报告异常并向用户显示消息。
  • @bakunin,首先 - 保存操作不应该在视图中,而是在某些准确的服务或存储库中。
    那么它的Save方法可以返回结果是操作成功与否。
  • @bakunin IIRC,如果您使用 ThreadException 事件显示对话框,表单将不会关闭,应用程序也不会崩溃。因此,用户可以更正提供的信息并重试。
  • @michasm 保存操作不在视图中。用户对多个域对象进行了一些更改,而不是立即保存它们。用户决定何时要保存。因此,在保存之前,他还对其他域对象进行了一些更改。执行此操作时会出现异常(原因是错误或其他)。所以我认为,用户希望有机会保存正确更改的域对象,而不是丢失所有未保存的数据。
  • @bakunin:我永远不会进行部分保存。如果对象是相互独立的,你也应该在 UI 中这样对待它们。
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2014-06-09
相关资源
最近更新 更多