代码之家  ›  专栏  ›  技术社区  ›  Shalom Craimer

C中是否有方法从控件/窗体捕获所有异常?

  •  1
  • Shalom Craimer  · 技术社区  · 15 年前

    我希望有类似“全部捕获”的内容,用于从控件内部或位于 当前线程 但不需要使用 Application.ThreadException 整个线程。

    为什么?因为我想保持异常处理模块化。

    可能导致问题的所有代码都在窗体中运行( DummyForm )在当前线程中运行的。我想把它们全部包在其他的例外中( DummyFormException )这会将该表单标识为异常的原因,这样,如果该异常导致了application.threadexception,我就可以知道清理涉及关闭 哑形 .

    如我所见,替代方案是:

    #在中包装每个引发的异常 哑形 用一个 DummyFormException(DummyFormException) . 我不太喜欢这样,因为它需要未来的程序员记住包装每个抛出的异常。 奔跑 哑形 在它自己的线程中,并使用 应用程序线程例外 捕捉它们,并识别代码中的线程。一旦我知道它来自哪里,我就可以简单地关闭 哑形 并结束线程。

    有没有办法不用多线程就可以做到这一点?我不想这样做,只是为了处理错误,这似乎是浪费。或者我这一切都错了?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Brann    15 年前

    我不确定把所有的错误处理代码放在一个地方是个好主意。

    错误处理最好发生在它处理的操作旁边。

    错误处理的关键是改变程序遇到错误时的程序行为。这意味着你 不得不 在那个位置编写特定的代码,你不能像你想的那样把所有的东西都放在一个地方。

    但是,也许您需要的只是一个帮助方法来记录东西,等等。


    未处理的异常处理程序(application.threadexception、appdomain.currentdomain.unhandledException)确实存在,但它们不是用于此目的的。

    您应该使用它们来处理意外的异常,即发生了一些您没有想到的错误,并且您希望能够很好地处理这种情况(例如,您可能希望记录错误,或者向用户显示一个好的错误框,或者轻轻地关闭程序)。

    如果你知道某个地方可能会发生异常, “某处”是编写异常处理代码的好地方。

        2
  •  2
  •   Jim Arnold    15 年前

    听布兰恩的话,否则你可能会在dailywtf.com上结束:—)

    将它留给全局错误处理程序将导致各种各样的痛苦。确保处理应用程序中的任何异常 在源头 -这就是你有正确信息来决定如何处理它的关键所在。