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

时间:2011-10-18 06:18:27

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

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

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 ....

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

5 个答案:

答案 0 :(得分:6)

你没有。当您收到AppDomain未处理的异常时,您的应用不再处于稳定状态。你究竟要回到哪里?当你已经达到这一点时,你唯一的理由就是退出。您可以合理地schedule yourself再次运行以确保应用程序返回,但更好的想法是在其源处实际处理异常并防止它成为UnhandledException。

答案 1 :(得分:4)

在app.config中添加以下元素

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

答案 2 :(得分:2)

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

如果要最小化使用try...catch的情况,如果满足必要的条件,则可以通过测试防止某些不良情况,因此您甚至不会调用已知的抛出特定异常的函数。喜欢打电话

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

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

然而,在大多数情况下,这是无法做到的,特别是对于网络而言,因为您无法预测电缆是否会被切断,信号是否会丢失,数据库服务器是否会被压碎等等交易。因此,每次连接到网络或向连接发送数据或从连接接收数据时都应try...catch

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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