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

C# 如何在未处理的异常之后继续运行?,c#,compact-framework,windows-mobile-6,C#,Compact Framework,Windows Mobile 6,我的应用程序中有以下代码,该代码在未处理的异常后运行: AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {

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

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

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

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

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

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

您不会。当您收到AppDomain未处理的异常时,您的应用程序将不再处于稳定状态。你会在哪里继续工作?当你到了那个地步,你唯一的选择,有充分的理由,就是退出。您可以合理地再次运行以确保应用程序返回,但更好的方法是在其源位置实际处理异常,并防止其成为未处理的异常。

您可以,并且您应该使用
try…catch
在可能发生异常的任何情况下处理异常。(在Java等语言中,您甚至无法编译代码,除非捕获被调用函数可能引发的每个异常,或者明确声明此特定函数不会捕获它,因此调用它的函数应该捕获它。)

如果您想尽量减少使用
try…catch
的情况,如果满足了必要的条件,则可以通过测试来防止某些不良情况,这样您甚至不会调用已知会引发特定异常的函数。喜欢打电话

if (myByteArray != null)
{
    myIPAddress = new IPAddress(myByteArray);
}
因为这样,
IPAddress
构造函数就不会抛出
ArgumentNullException


但是,在大多数情况下,这是不能做到的,特别是在网络中,因为你不能预测电缆是否会被切断,信号会丢失,数据库服务器会崩溃,等等。因此,每次连接到网络或向某个连接发送数据或从该连接接收数据时,您都应该尝试捕获。

在app.config中添加以下元素

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

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

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


Application.Restart()有效吗?在Application.Run之前订阅事件?@ojlovecd Application.Restart()在CF 3.5中不受支持。@Reniuz这是什么意思?它是什么类型的异常?您是否尝试过用try-catch将main方法中的所有代码包围起来?或者尝试更改功能标志。请阅读更多关于主要方法不起作用的文章。还是一样。那么更改功能标志呢?我在谷歌搜索,但我不知道功能标志的含义。我在这里详细介绍了此解决方案(方法2)。Microsoft说
我们不建议您更改默认行为。如果忽略异常,应用程序可能会泄漏资源并放弃锁。
这在app.config中似乎不起作用。由@gingerbreadboy链接的文章说,代码需要在%WINDIR%\Microsoft.NET\Framework\v2.0.50727\aspnet.config中。罗伯特·斯莱德·刘易斯(Robert Slade LewisNot)两年前就给出了这个答案。如果您坚持在异常发生时处理所有异常,那么有时会在应用程序不再处于稳定状态时恢复执行。相反,处理所有可以在最佳恢复点进行有意义恢复的特定异常,并让所有其他异常冒泡
AppDomain.CurrentDomain.UnhandledException
是最后一种方法,它允许您记录异常或显示崩溃对话框,但此时您无法恢复,这是正确的。在此之前,我曾处理过一个应用程序,该应用程序在旧的Windows CE设备上以kiosk模式运行。业务要求用户永远不能离开应用程序。是的,处理某些异常会使应用程序处于不稳定状态。是的,正常的处理方法是使用
未处理的异常
。但问题是不离开应用程序,有时这比保持稳定状态更重要。在这种情况下,最后的异常处理程序应该在让当前实例死亡之前启动应用程序的新实例。试图在任何无法显式处理的异常之后一瘸一拐地继续运行是疯狂的,因为您不知道应用程序内部数据的状态。如果您认为缓冲区溢出很糟糕。。。