【问题标题】:How do I continue running after an unhandled exception?如何在未处理的异常后继续运行?
【发布时间】:2011-12-09 19:56:05
【问题描述】:

我的应用程序中有以下代码在未处理的异常后运行:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            var exception = e.ExceptionObject as Exception;
            if (exception != null) MessageBox.Show(exception.Message + " - " + exception.StackTrace);
        }

但即使我发现未处理的异常,我的 Windows 移动应用程序也会关闭。当我捕获未处理的异常时如何防止关闭应用程序。我从不想关闭我的应用程序。我想在这种情况下打开登录表单或其他任何不关闭应用程序。

所以我想要的是防止关闭应用程序出现未处理的异常,例如网络关闭,...

我不能在每个代码中都使用 try catch ....

知道如何防止在网络中断或任何其他未处理的异常时关闭应用程序吗?

【问题讨论】:

  • Application.Restart() 有效吗?
  • 在 Application.Run 之前订阅事件?
  • @ojlovecd Application.Restart() 在 CF 3.5 中不受支持。
  • @Reniuz 你是什么意思?
  • 这是什么异常?

标签: c# compact-framework windows-mobile-6


【解决方案1】:

我认为你需要使用Application.ThreadException 当您订阅 Application.ThreadException 时,未处理的异常不会触发 UnhandledException 并且应用程序将继续运行。

【讨论】:

  • 你试过用try catch包围main方法中的所有代码吗?
  • 或者尝试更改功能标志。阅读更多here
  • ty 抓住主要方法没有帮助。还是一样。
  • 那么改变能力标志怎么样?
  • 我在谷歌搜索,但我不知道能力标志是什么意思
【解决方案2】:

你没有。当您收到 AppDomain 未处理异常时,您的应用程序不再处于稳定状态。你究竟会恢复到哪里?当你到了那个地步,你唯一的选择,有充分的理由,就是退出。您可以合理地 schedule yourself 再次运行以确保应用程序恢复正常,但更好的办法是在源头实际处理异常并防止它成为 UnhandledException。

【讨论】:

    【解决方案3】:

    您可以,而且您应该使用try...catch 并在可能发生异常的每种情况下处理异常。 (在像 Java 这样的语言中,在捕获被调用函数可能抛出的每个异常或明确声明该特定函数不会捕获它之前,您甚至无法编译代码,因此调用它的人应该这样做。)

    如果您想尽量减少使用try...catch 的情况,可以通过测试是否满足必要条件来防止某些不良情况,这样您甚至不会调用以抛出特定异常而闻名的函数。喜欢打电话

    if (myByteArray != null)
    {
        myIPAddress = new IPAddress(myByteArray);
    }
    

    因为这样IPAddress 构造函数不会抛出ArgumentNullException

    但是在大​​多数情况下这是无法做到的,尤其是在联网的情况下,因为您无法预测中途是否会切断电缆、信号会丢失、数据库服务器会崩溃等等的交易。因此,每次连接到网络或向连接发送数据或从连接接收数据时,您都应该try...catch

    【讨论】:

    • 并非如此。如果您坚持在 所有 异常发生时处理它们,那么您有时会在应用程序不再处于稳定状态时恢复执行。相反,处理所有特定异常,您可以在最能恢复的点上有意义地恢复,并让所有其他异常冒泡。 AppDomain.CurrentDomain.UnhandledException 是最后的手段,它允许您执行诸如记录异常或显示崩溃对话框之类的操作,但非常正确的是,您此时无法恢复。
    • 我之前开发过一个应用程序,该应用程序在旧的 Windows CE 设备上以 kiosk 模式运行。用户永远不能离开应用程序是一项业务需求。是的,处理一些异常会使应用程序处于不稳定状态。是的,正常的方法是使用UnHandledException。但问题在于不要离开应用程序,有时这比保持稳定状态更重要。
    • 在这种情况下,最后的异常处理程序应该在让当前实例终止之前启动应用程序的新实例。在您无法明确处理的任何异常之后试图跛行是疯狂的,因为您不知道应用程序内部数据的状态。如果你认为缓冲区溢出不好......
    【解决方案4】:

    在您的 app.config 中添加以下元素

    <runtime>
      <!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
      <legacyUnhandledExceptionPolicy enabled="1" />
    </runtime>
    

    【讨论】:

    • FYI 这里有详细的解决方案(方法 2)support.microsoft.com/kb/911816 MicrosoftWe do not recommend that you change the default behavior. If you ignore exceptions, the application may leak resources and abandon locks.
    • 这似乎在 app.config 中不起作用。 @gingerbreadboy 链接的文章说代码需要在 %WINDIR%\Microsoft.NET\Framework\v2.0.50727\aspnet.config
    【解决方案5】:

    AppDomain.CurrentDomain.UnhandledException 触发任何未处理的异常 任何线程,但自 CLR 2.0 起,CLR 会在您的事件发生后强制关闭应用程序 处理程序完成。但是,您可以通过将以下内容添加到 您的应用程序配置文件:

    <configuration>
      <runtime>
        <legacyUnhandledExceptionPolicy enabled="1" />
      </runtime>
    </configuration>
    

    【讨论】:

    • 罗伯特·斯莱德·刘易斯 2 年前已经给出了这个答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2015-07-26
    相关资源
    最近更新 更多