【问题标题】:How to catch unhandled exceptions in custom controls如何在自定义控件中捕获未处理的异常
【发布时间】:2012-02-03 12:30:46
【问题描述】:

对于 VB 中的用户控件,有什么类似于 MyApplication_UnhandledException 的吗? 我希望有一个中心点来捕获用户控件的所有未处理异常,而不会将异常传播到使用用户控件的应用程序。

我做了一些测试,在没有 try/catch 代码的用户控件方法中引发异常(当然,在真正的项目中,所有方法都有一个 try/catch 块)。 异常被使用用户控件的应用程序的 MyApplication_UnhandledException 事件捕获。 但这离异常发生​​的地方太“远”了,在最坏的情况下,用户应该重新启动应用程序。

我想为用户控件实现一个行为,以便如果用户控件失败,异常不会传播到应用程序,而只是在用户控件级别捕获。

有什么建议吗?谢谢。

编辑:我忘了说我在谈论 WinForm

【问题讨论】:

    标签: vb.net winforms visual-studio-2010 exception-handling user-controls


    【解决方案1】:

    不,真的没有。表单线程有一个exception handler,但这也是全局的(即所有表单都参与)。

    您唯一真正的选择是在整个过程中添加适当的 try/catch 块。

    【讨论】:

    • 使用 Application.ThreadException 事件而不是 MyApplication_UnhandledException 事件有什么好处?
    • 最大的不同是允许用户忽略Windows Forms线程中引发的异常有可能让程序继续成功运行。例如,如果开发人员忘记向按钮单击事件添加异常处理程序,则 ThreadException 可能会报告异常并询问用户是否要继续。如果他们这样做,异常将被忽略;如果他们不这样做,应用程序可能会被终止。
    • 好吧,如果我理解的话,我会更喜欢应用程序级别的 ThreadException。通常在应用程序中同时使用 ThreadException 和 MyApplication_UnhandledException 吗?
    • 如果在 winforms 线程中发生异常,我们总是挂钩 ThreadException 以让用户有机会继续(风险自负)。而且我们有一个框架,它总是挂钩 UnhandledException 并以标准方式处理它,所以对我们来说很常见。如果您不想/不需要给用户继续的机会,只需挂钩 Unhandled 就可以了。
    【解决方案2】:

    该异常的 InnerException 不为空吗?有时它会下降几个级别,但您可以递归迭代,直到找到最里面的 InnerException 并记录该 ErrorMessage 和 StackTrace。

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 2018-10-19
      • 2010-09-05
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多