【问题标题】:Where to put exception handler for form level exception在哪里放置表单级异常的异常处理程序
【发布时间】:2014-10-14 13:37:51
【问题描述】:

长期以来,我通过返回值来指示程序中的错误。最近我改用抛出异常,这似乎使代码更简洁,因此更面向目标。

我能够设置异常处理程序

  • 在应用程序级别(有很多关于这个主题的资源)
  • 在需要的情况下临时进行

但我不知道是否可以在表单级别设置异常处理程序。 预期行为:

  • 如果 FormA.Button_Click() 抛出异常,它会在 FormA 的处理程序中捕获
  • 如果 FormB.Button_Click() 抛出异常,它会被 FormB 的处理程序捕获

目标是避免将单个try/catch 放入许多事件处理程序中(但许多包含非平凡的操作,因此需要处理)。但我仍然希望留在表单的上下文中,在显示错误消息后保持当前表单打开和活动(例如在 MsgBox() 中)。

表单的主事件循环在哪里,以便我可以在其中放置异常处理程序?这种方法正确吗?

(感兴趣的平台:WPF + VB.NET,但我也懂 WinForms 并会说 C#

【问题讨论】:

  • 不要将业务逻辑放在您的事件中并将所有事件路由到控制器,以便您可以在其中处理所有异常。
  • @Amorphis - 请考虑将此评论转换为答案,以便它最终可以被接受,如果没有人提供更有用的答案。此外,您的建议将异常处理问题转移到控制器级别(如果我不想编写单独的 try/catch 语句。在这种情况下,包含异常处理程序的命令包装器是一个好方法吗?)

标签: .net wpf forms exception-handling


【解决方案1】:

WinForms 和 WPF 都提供“未处理的异常”事件,您可以订阅和报告未处理的异常。请参阅 Application.DispatcherUnhandledException (WPF) 和 Application.ThreadException (Forms)。

但是,恕我直言,最好让每个原始 UI 事件处理程序捕获并处理异常。到引发事件时,您没有太多有用的上下文来处理异常,并且您的程序可能仍处于或可能不处于连贯状态(取决于异常)。

对于您可以安全处理的异常,需要在了解如何以及为什么可以安全处理它们的操作上下文中进行处理。对于其他异常,您可能不希望程序继续执行……最多,您需要记录和/或向用户报告错误,然后尽可能干净地关闭程序.

请注意,根据 Amorphis 的回复,这可能涉及到控制器的路由。但异常的实际捕获和初始处理仍应驻留在启动最终导致异常的操作的 UI 事件处理程序中。

【讨论】:

    【解决方案2】:

    事件是底层调用,没有可见代码调用它们,因此您必须将调用重新路由到应用程序的中心点。

    您对命令包装器的建议是一个很好的建议。 您还可以查看面向方面的编程,在其中您可以在事件被触发之前添加代码(也可以在......之后)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多