Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForms/WPF中的异常处理_C#_Wpf_Winforms_Exception - Fatal编程技术网

C# WinForms/WPF中的异常处理

C# WinForms/WPF中的异常处理,c#,wpf,winforms,exception,C#,Wpf,Winforms,Exception,WinForms或WPF中异常处理的最佳实践是什么。到目前为止,我还没有找到令人满意的解决办法。有些人建议捕获未处理的异常事件。但我认为这不是一个好的解决方案 问题 我有一个3层的应用程序。持久层、业务层和ui层。我认为捕捉异常的正确位置是ui层,而不是在所有三个层中捕捉异常。因此,用户将收到一条错误消息,也许还有一种方法用户可以“解决”问题(错误的数据输入等) 所以问题是,用try-catch块包围每个ui事件处理程序(单击事件、选择更改事件等)的最佳/正确方法是什么?像这样: private

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

问题

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

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

private void button_MouseUp(object sender, MouseButtonEventArgs e)
{
   try
   {
      /// ...
   }
   catch (Exception ex)
   {
      // log exception
      // show error to user if necessary
   }
}
我知道捕获所有异常是不好的。当然,您需要通过验证用户输入数据来防止异常。但有时会出现bug;)

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

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

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

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

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

以下是我的黄金法则:

  • 始终通过确保提供的数据正确来防止异常
  • 仅捕获可用于解决问题而无需用户参与的异常
  • 对所有其他错误使用
    Application.ThreadException
    事件(并记录它们)
  • 如果您想:

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

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

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

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

    以下是我的黄金法则:

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

  • 如果愿意,您可以阅读“我的异常”系列:

    “每一个”都在顶部,不建议捕获所有类型(异常ex)。最佳做法是在将导致错误时防止用户操作:例如:未选择任何内容,用户单击,您可以处理可能获得的nullreference,也可以确保在选择某个内容之前禁用该按钮。这种方法适用于很多情况,我知道不建议捕获所有类型的异常。是的,预防错误是一种很好的做法。但是想象一下,用户所做的一些更改还没有保存到数据库中。然后用户单击一个按钮。按钮处理程序有一个bug,因此应用程序崩溃。显示错误消息并让用户决定何时退出应用程序不是更好吗?使用这种方法,用户将有机会保存更改。“每一个”都是最重要的,不建议捕获所有类型(异常ex)。最佳做法是在用户操作将导致错误时防止用户操作:例如:当未选择任何内容而用户单击时,您可以处理可能获得的nullreference,也可以确保在选择某个内容之前禁用该按钮。这种方法适用于很多情况,我知道不建议捕获所有类型的异常。是的,预防错误是一种很好的做法。但是想象一下,用户所做的一些更改还没有保存到数据库中。然后用户单击一个按钮。按钮处理程序有一个bug,因此应用程序崩溃。显示错误消息并让用户决定何时退出应用程序不是更好吗?使用这种方法,用户将有机会保存更改。我已经编辑了这个问题。当您想让用户有机会保存所做的更改时,您会怎么做?重复的事情正是我在每个ui事件中都要处理try-catch块的原因。我没有在每个catch块中写入logger.log(…),而是创建了一个ExceptionUI控件,用于记录/报告异常并向用户显示消息。@bakunin,首先-保存操作不应出现在视图中,而应出现在某个准确的服务或存储库中
    那么它的
    Save
    方法可能会返回操作成功与否的结果。@bakunin IIRC,如果使用ThreadException事件显示对话框,窗体将不会关闭,应用程序也不会崩溃。因此,用户可以更正提供的信息并重试。@michasm