何处为表单级异常放置异常处理程序

时间:2014-10-14 13:37:52

标签: .net wpf forms exception-handling

很长一段时间,我通过返回值来表示程序中的错误。最近我转而抛出异常,这些异常似乎使代码更清晰,因此更加注重目标。

我可以设置异常处理程序

  • 关于应用程序级别(关于此主题的资源很多)
  • 在必要时临时提供

但我无法弄清楚是否可以在表单级别设置异常处理程序。 预期的行为:

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

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

表单的主事件循环位于何处,所以我可以在其中放置异常处理程序?这种方法是否正确?

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

2 个答案:

答案 0 :(得分:2)

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

然而,恕我直言,每个原始UI事件处理程序捕获和处理异常更好。当事件被提出时,你没有那么多有用的上下文来处理异常,你的程序可能会或可能不会处于连贯状态(取决于例外)。

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

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

答案 1 :(得分:1)

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

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