如何在出现未处理的异常后继续运行

本文关键字:异常 继续 运行 未处理 | 更新日期: 2023-09-27 18:11:45

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

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移动应用程序关闭。如何防止关闭应用程序时,我捕获未处理的异常。我从来不想关闭我的应用程序。我想在这种情况下打开登录表单或其他任何不关闭应用程序。

所以我想要的是防止关闭应用程序从未处理的异常,如网络是down,…

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

任何想法如何防止关闭应用程序时,网络关闭或任何其他未处理的异常?

如何在出现未处理的异常后继续运行

你没有。当你得到一个AppDomain未处理异常时,你的应用就不再处于稳定状态了。你到底会回到哪里?当你到了那个地步,你唯一的选择,有充分理由的,就是退出。你可以合理地安排自己再次运行以确保应用程序返回,但一个更好的主意是在其源处实际处理异常,并防止它成为UnhandledException。

在app.config中添加以下元素

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

您可以而且应该使用try...catch,并在任何可能发生异常的情况下处理异常。(在像Java这样的语言中,你甚至不能编译你的代码,直到你捕获了被调用函数可能抛出的每个异常,或者显式地声明这个特定的函数不会捕获它,所以调用它的人应该做。)

如果你想尽量减少使用try...catch的情况,一些糟糕的情况可以通过测试来避免,如果必要的条件得到满足,那么你甚至不会调用一个已知会抛出特定异常的函数。就像调用

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

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

然而,在大多数情况下,这是不可能做到的,特别是在网络中,因为您无法预测在事务中间电缆是否会被切断,信号是否会丢失,数据库服务器是否会崩溃等。因此,每次连接到网络或向连接发送数据或从连接接收数据时,都应该使用try...catch

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

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

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