【问题标题】:Is try/catch around whole C# program possible?是否可以尝试/捕获整个 C# 程序?
【发布时间】:2010-12-08 18:03:25
【问题描述】:

C# 程序由以下人员调用:

Application.Run (new formClass ());

我想在整个过程中使用 try/catch 来捕获任何未捕获的异常。当我把它放在这个 Run 方法周围时,不会捕获异常;仅当程序在未捕获的异常后终止时,控件才会返回此处。

我可以在哪里放置 try/catch 来覆盖整个程序?谢谢!

【问题讨论】:

  • 我认为您错过了异常过程的要点,如果异常冒泡到应用程序的最顶层,则需要在代码中解决一些错误。将 try/catch 放在您认为可能失败的代码周围,并在 catch 中提供缓解(在可能的情况下)。如果无法缓解,即应用程序无法恢复,则应用程序需要失败。
  • OP 不是在问应该如何使用异常——只是在特定情况下如何捕获它们。显然,如果顶层出现异常,则说明出现问题 - 似乎他想在出现问题时找出更多信息,以便解决问题。米奇的回答比假设操作员不知道他在做什么更有帮助。
  • 在顶层捕获所有异常对于在退出前最后报告发生的事情非常有用。在许多情况下,我认为这比看到标准的 Windows“此程序已崩溃,请向 Microsoft 报告”对话框更好。

标签: c# exception-handling try-catch


【解决方案1】:

要捕获 Windows 窗体的未处理异常,请连接 AppDomain.UnhandledExceptionApplication.ThreadException 事件。

感兴趣的:Unexpected Errors in Managed Applications

【讨论】:

  • @alankdkd:确保您阅读到最后和“一些最佳实践”部分;)
  • 你不能用AppDomain.UnhandledException 捕获异常(它仍然会终止应用程序),而只是得到通知。与异常捕获的Application.ThreadException 相比,这是一个重要的区别。
  • 我无法让 UnhandledException 工作。我试过:
     AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
    但是当出现异常时,MyHandler 永远不会被调用。我会试试 ThreadException...
【解决方案2】:

基本上,在使用默认 CLR 托管进程时,您无法捕获所有异常。时期。这是因为AppDomain.UnhandledException事件只是一个通知,您无法处理异常(这意味着您无法阻止应用程序在处理完通知后被终止)。

但是,您可以使用其Application.ThreadException 处理程序(和control the behavior 通过UnhandledExceptionMode)捕获和处理WinForms 应用程序的UI 线程中的所有异常。其他抛出异常的线程不会被这个处理程序捕获。

一般来说,尝试处理所有异常并不是一个好主意。但是,您可以使用 AppDomain.UnhandledException 记录错误和/或执行重要的清理任务(例如关闭基于文件的数据库或其他)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2015-11-14
    相关资源
    最近更新 更多